欢迎访问宙启技术站
智能推送

Java中的文件和IO函数:文件读写和流处理函数。

发布时间:2023-05-25 13:00:25

Java中的文件和IO函数是可以通过对文件进行读写操作和流处理的函数。在实际开发中,文件读写和流处理经常使用,因为处理文件为了操作文件的数据或将文件传输到不同的位置或设备,需要使用文件IO功能,文件IO操作主要分为两个方面:文件的读取和文件的写入。

文件读取

在Java中,文件读取通常基于InputStream、Reader或Channel进行,InputStream供应了读取原始字节流的读取方法。 Reader供应了读取字符流的读取方法,而Channel提供了一种基于NIO非阻塞IO的IO读取方法。下面我们分别介绍这三种读取方式。

1.InputStream方式

InputStream方式可以从文件中读取字节,并将读取结果存储到byte数组缓冲区中。在Java中提供了很多InputStream的实现,最常用的是FileInputStream和BufferedInputStream。 FileInputStream可以从文件中读取数据,而BufferedInputStream则使得文件读取更高效。下面给出一个文件读取的示例代码:

FileInputStream fis = new FileInputStream("data.txt");

BufferedInputStream bis = new BufferedInputStream(fis);

byte[] buffer = new byte[1024];

int len = 0;

while((len = bis.read(buffer)) != -1) {

    //对buffer中读取的字节数据进行处理

}

在这个例子中,我们首先创建了一个FileInputStream对象fis,然后通过fis创建了一个BufferedInputStream对象bis。这个缓冲区会将字节数组分块读取到缓存中,以提高文件读写效率。在while循环中,当每次读取到的数据比缓存区的大小小(即和缓存区的最后一部分数据一块读取了)或读取到文件末尾时,就完成了一次数据的读取。

2.Reader方式

Reader方式使用字符流读取文件中的字符。常见的Reader的实现是FileReader和BufferedReader。其中,FileReader提供了从文件读取数据到字符流的便捷方法,而 BufferedReader则提供了XBUF(缓冲区)方式,能够更快地读取文件。

下面是一个用Reader方式读取文件的示例代码:

FileReader fr = new FileReader("data.txt");

BufferedReader br = new BufferedReader(fr);

String data = null;

while ((data = br.readLine()) != null) {

    //对读取到的字符串进行处理

}

在这个示例中,我们创建了一个FileReader对象fr,然后通过这个对象创建了一个BufferedReader对象br。这样,我们就可以使用readLine方法从缓冲区读取数据,直到读取到EOF(文件末尾)。

3.Channel方式

Java NIO(Non-blocking IO)中的Channel方式具有高性能和可扩展性,是NIO的特色之一。NIO的主要目的是允许高速缓冲区I / O,集中缓冲区I / O优化读取和写入集合数据时的性能。

下面是一个使用Channel方式读取文件的示例代码:

RandomAccessFile aFile = new RandomAccessFile("data.txt", "rw");

FileChannel inChannel = aFile.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

int bytesRead = inChannel.read(buffer);

while (bytesRead != -1) {

    buffer.flip();

    while (buffer.hasRemaining()) {

        System.out.print((char) buffer.get());

    }

    buffer.clear();

    bytesRead = inChannel.read(buffer);

}

aFile.close();

在这个代码示例中,我们先创建了一个RandomAccessFile对象 aFile,然后通过 aFile 创建了一个 FileChannel对象inChannel。这个示例是循环读取,并判断是否读到了文件的尽头。

文件写入

文件写入与读取的区别在于,对于文件的写操作,需要使用 OutputStream、Writer 或 Channel,可以将数据按指定格式写入到文件中。

1.OutputStream方式

OutputStream方式是将以字节数组形式写入一个文件。最常见的OutputStream实现是FileOutputStream和BufferedOutputStream。下面是使用OutputStream方式写入文件的示例代码: 

String data = "测试数据";

byte[] bytes = data.getBytes();

FileOutputStream fos = new FileOutputStream("data.txt");

BufferedOutputStream bos = new BufferedOutputStream(fos);

bos.write(bytes);

bos.close();

fos.close();

在这个代码示例中,我们首先将字符串"data"转换成了字节数组,然后创建FileOutputStream对象 fos,并通过fos创建了BufferedOutputStream对象 bos。当然,还可以在bos中定义缓存区大小进行效率优化。最后我们通过调用 bos.write() 方法将字节数据写入文件中。

2.Writer方式

Writer方式是将字符写入一个文件。常见的Writer实现是 FileWriter 和 BufferedWriter。下面是一个用Writer方式写入文件的示例代码:

String data = "测试数据";

FileWriter fw = new FileWriter("data.txt");

BufferedWriter bw = new BufferedWriter(fw);

bw.write(data);

bw.newLine();

bw.close();

fw.close();

在这个代码示例中,我们首先创建FileWriter对象 fw,并通过fw创建了BufferedWriter对象 bw。这个BufferedWriter对象具有自定义缓存区大小的功能。最后我们通过调用bw.write(data);向文件写入数据。

3.Channel方式

Channel方式向文件写入数据的主要实现是FileChannel和ByteBuffer。下面是一个使用Channel方式写入文件的示例代码:

String data = "测试数据";

FileOutputStream fileOut = new FileOutputStream("data.txt");

FileChannel channelOut = fileOut.getChannel();

ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());

channelOut.write(buffer);

channelOut.close();

fileOut.close();

在这个代码示例中,我们首先创建一个FileOutputStream对象 fileOut,并通过 fileOut创建了Channel对象 channelOut。这里我们使用ByteBuffer.wrap() 方法将data字符串类型的数据进行序列化后存储到buffer中,接着调用channelOut.write() 方法将序列化后的数据写入到文件中,完成了一次数据的快速写入。

优化建议

在使用文件和IO函数读写和流处理时,还有一些优化建议:

1.对文件读写频繁的操作尽量使用BufferedReader和BufferedWriter来提高读写效率。

2.如果读写的是二进制文件,使用BufferedInputStream和BufferedOutputStream会更加有效。

3.对于长时间读写文件的应用程序,可以使用MemoryMappedByteBuffer来提高读写速度。

总结

Java中的文件和IO函数是Java语言的核心功能之一,涵盖了输入输出文件和流的处理。Java提供了多种文件读写方式和不同的流处理,开发人员可以根据自己的需要选择最适合的方式来实现文件读写和流处理。了解Java文件和IO函数的使用也是Java程序开发人员必备的技能之一,同时,在进行文件和IO操作时,采用多种优化技巧来提高效率也是非常重要的。