什么是 Java 中的缓冲流

在 Java 里,缓冲流属于处理流的一种,它是对节点流的包装。缓冲流主要包含 BufferedInputStreamBufferedOutputStream(用于字节流),以及 BufferedReaderBufferedWriter(用于字符流)。其内部具备一个缓冲区,该缓冲区是一个数组,可一次性从数据源读取大量数据存储其中,或者将大量数据一次性写入到目标位置,而不是每次只处理一个字节或字符。

缓冲流的作用

  • 减少 I/O 操作次数:文件读写操作涉及到磁盘、网络等 I/O 设备,这些操作的速度相对较慢。缓冲流通过在内存中设置缓冲区,一次性读取或写入大量数据,减少了与 I/O 设备的交互次数,从而提高了性能。
  • 提高数据传输效率:由于内存的读写速度远远快于磁盘、网络等 I/O 设备,缓冲流将数据暂时存储在内存缓冲区中,当缓冲区满或者达到一定条件时再进行实际的 I/O 操作,充分利用了内存的高速读写特性,提升了数据传输的效率。

如何使用缓冲流来提高文件读写性能

使用字节缓冲流进行文件复制

以下是一个使用 BufferedInputStreamBufferedOutputStream 进行文件复制的示例代码:

BufferedByteStreamExample.java

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedByteStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.jpg");
             BufferedInputStream bis = new BufferedInputStream(fis);
             FileOutputStream fos = new FileOutputStream("output.jpg");
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}    

在上述代码中,BufferedInputStream 包装了 FileInputStreamBufferedOutputStream 包装了 FileOutputStream。通过使用一个字节数组 buffer 作为缓冲区,一次性从输入流读取最多 1024 个字节的数据,然后一次性写入到输出流中,减少了与磁盘的交互次数。

使用字符缓冲流进行文本文件读写

以下是一个使用 BufferedReaderBufferedWriter 进行文本文件读写的示例代码:

BufferedCharacterStreamExample.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedCharacterStreamExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {

            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}    

在这个示例中,BufferedReader 包装了 FileReaderBufferedWriter 包装了 FileWriterBufferedReaderreadLine() 方法可以一次性读取一行文本,BufferedWriter 可以将数据先存储在缓冲区中,当缓冲区满或者调用 flush() 方法时再将数据写入到文件中,提高了文本文件的读写性能。