Appearance
2026-08-27 · 字节流、字符流、缓冲流——文件读写的核心机制。
Java IO 流
1. IO 流是什么
IO = Input/Output,数据从源头到目的地的通道:
数据源(文件/网络/内存)
│ 输入流(读取)
▼
程序
│ 输出流(写入)
▼
目的地(文件/控制台/网络)流的分类:
| 维度 | 类型 | 说明 |
|---|---|---|
| 方向 | 输入流(InputStream/Reader) | 读取数据 |
| 方向 | 输出流(OutputStream/Writer) | 写入数据 |
| 数据 | 字节流(InputStream/OutputStream) | 处理二进制(图片、视频) |
| 数据 | 字符流(Reader/Writer) | 处理文本(txt、csv) |
2. 字节流(InputStream/OutputStream)
处理二进制数据(图片、视频、任意文件):
java
import java.io.*;
// 文件 → 程序(读取)
try (FileInputStream fis = new FileInputStream("test.txt")) {
int data;
while ((data = fis.read()) != -1) { // read() 返回 -1 表示读完
System.out.print((char) data);
}
}
// 程序 → 文件(写入)
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write("Hello".getBytes()); // 写入字符串
}字节流操作的是
int(0-255)。文本文件用字符流更方便。Spring Boot 里文件上传下载用的就是字节流。
3. 字符流(Reader/Writer)
处理文本数据,自动处理编码:
java
import java.io.*;
// 文件 → 程序(读取)
try (FileReader reader = new FileReader("test.txt")) {
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data); // 直接是字符
}
}
// 程序 → 文件(写入)
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write("Hello World");
}字符流底层还是字节流,但自动处理了编码转换(UTF-8 等)。
4. 缓冲流(Buffered*)
包装在基础流外面,减少实际 IO 次数(性能大幅提升):
java
import java.io.*;
// 缓冲字符流(最常用:按行读取)
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) { // 按行读取!
System.out.println(line);
}
}
// 缓冲字符流(写入)
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("第一行");
bw.newLine(); // 换行(跨平台)
bw.write("第二行");
}缓冲流 vs 基础流:
| 对比 | 基础流 | 缓冲流 |
|---|---|---|
| 读取方式 | 逐字节/字符 | 按行或批量 |
| 性能 | 慢(频繁磁盘IO) | 快(内存缓冲) |
| 特殊方法 | 无 | readLine()、newLine() |
读取文本文件首选
BufferedReader.readLine(),这是最常用的方式。
5. try-with-resources(自动关闭)
IO 流用完后必须关闭,用 try-with-resources 最安全:
java
// ❌ 旧写法(容易忘关闭)
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("test.txt"));
// 使用 br
} finally {
if (br != null) br.close(); // 手动关闭
}
// ✅ 新写法(自动关闭,推荐)
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} // 自动调用 br.close()IO 操作一律用 try-with-resources,不要手动 close。
6. 常用 IO 操作速查
java
// 读取整个文件为字符串(Java 11+)
String content = Files.readString(Path.of("test.txt"));
// 写入字符串到文件(Java 11+)
Files.writeString(Path.of("output.txt"), "Hello World");
// 按行读取(Java 8+)
List<String> lines = Files.readAllLines(Path.of("test.txt"));
// 按行写入(Java 8+)
Files.write(Path.of("output.txt"), List.of("line1", "line2"));简单文件读写直接用
Files.readString()/Files.writeString()一行完成,不用手动创建流。复杂场景(大文件、流式处理)再用 BufferedReader/Writer。