什么是 Java 中的缓冲流
在 Java 里,缓冲流属于处理流的一种,它是对节点流的包装。缓冲流主要包含 BufferedInputStream
和 BufferedOutputStream
(用于字节流),以及 BufferedReader
和 BufferedWriter
(用于字符流)。其内部具备一个缓冲区,该缓冲区是一个数组,可一次性从数据源读取大量数据存储其中,或者将大量数据一次性写入到目标位置,而不是每次只处理一个字节或字符。
缓冲流的作用
- 减少 I/O 操作次数:文件读写操作涉及到磁盘、网络等 I/O 设备,这些操作的速度相对较慢。缓冲流通过在内存中设置缓冲区,一次性读取或写入大量数据,减少了与 I/O 设备的交互次数,从而提高了性能。
- 提高数据传输效率:由于内存的读写速度远远快于磁盘、网络等 I/O 设备,缓冲流将数据暂时存储在内存缓冲区中,当缓冲区满或者达到一定条件时再进行实际的 I/O 操作,充分利用了内存的高速读写特性,提升了数据传输的效率。
如何使用缓冲流来提高文件读写性能
使用字节缓冲流进行文件复制
以下是一个使用 BufferedInputStream
和 BufferedOutputStream
进行文件复制的示例代码:
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
包装了 FileInputStream
,BufferedOutputStream
包装了 FileOutputStream
。通过使用一个字节数组 buffer
作为缓冲区,一次性从输入流读取最多 1024 个字节的数据,然后一次性写入到输出流中,减少了与磁盘的交互次数。
使用字符缓冲流进行文本文件读写
以下是一个使用 BufferedReader
和 BufferedWriter
进行文本文件读写的示例代码:
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
包装了 FileReader
,BufferedWriter
包装了 FileWriter
。BufferedReader
的 readLine()
方法可以一次性读取一行文本,BufferedWriter
可以将数据先存储在缓冲区中,当缓冲区满或者调用 flush()
方法时再将数据写入到文件中,提高了文本文件的读写性能。