缓冲流
缓冲流在内存中维护缓冲区,减少磁盘IO次数,提高读写效率。
缓冲流的作用
工作原理
Java
普通流:每次读写 → 直接操作磁盘(慢)
缓冲流:多次读写 → 先存缓冲区 → 一次批量操作磁盘(快)
效率对比
- 普通流:读取1000个字节 = 1000次磁盘IO
- 缓冲流:读取1000个字节 ≈ 几次磁盘IO(每次读8KB)
字节缓冲流
类名
BufferedInputStream:字节输入缓冲流BufferedOutputStream:字节输出缓冲流
使用方式
Java
// 包装普通流
InputStream is = new FileInputStream("source.txt");
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("target.txt");
BufferedOutputStream bos = new BufferedOutputStream(os);
// 简洁写法
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("source.txt")
);
读写操作
Java
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("source.jpg")
);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("target.jpg")
);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush(); // 确保数据写入
bis.close();
bos.close();
字符缓冲流
类名
BufferedReader:字符输入缓冲流BufferedWriter:字符输出缓冲流
特有方法
| 方法 | 说明 |
|---|---|
| readLine() | 读取一行文本(BufferedReader) |
| newLine() | 写入换行符(BufferedWriter) |
使用示例
Java
// 按行读取文本
BufferedReader br = new BufferedReader(
new FileReader("test.txt")
);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
// 按行写入文本
BufferedWriter bw = new BufferedWriter(
new FileWriter("test.txt")
);
bw.write("第一行");
bw.newLine(); // 写入换行
bw.write("第二行");
bw.close();
readLine()返回String,读到末尾返回null,不包含换行符。
缓冲区大小
默认大小
- 字节缓冲流:8KB(8192字节)
- 字符缓冲流:8KB字符
自定义大小
Java
// 指定缓冲区大小
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("test.txt"),
16 * 1024 // 16KB缓冲区
);
缓冲流是包装流
特点
- 不能直接连接数据源
- 必须包装在节点流之上
- 关闭外层缓冲流会自动关闭内层流
包装关系
Java
数据源 → 节点流 → 缓冲流 → 程序
(文件) → FileInputStream → BufferedInputStream → read()
Java
// 关闭缓冲流即可,内部流自动关闭
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
// ...
br.close(); // FileReader也会被关闭
最佳实践
文件复制示例
text
// 高效复制文件
try (
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("source.jpg")
);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("target.jpg")
)
) {
byte[] buffer = new byte[8192];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
}
按行读取示例
text
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
List<String> lines = br.lines().collect(Collectors.toList());
}
要点总结
- 缓冲流减少IO次数,提高效率
- 字节缓冲流:BufferedInputStream/BufferedOutputStream
- 字符缓冲流:BufferedReader/BufferedWriter
- BufferedReader.readLine()读取一行
- BufferedWriter.newLine()写入换行
- 缓冲流是包装流,必须包装节点流
- 默认缓冲区8KB,可自定义
- 关闭缓冲流自动关闭内层流
📝 发现内容有误?点击此处直接编辑