Skip to content

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。