Skip to content

BufferedWriter 高效写入文本

写文件时,为什么推荐用 BufferedWriter 而不是直接用 FileWriter

性能差异是一方面,更重要的是:BufferedWriter 提供了 newLine() 方法,能自动适配不同平台的换行符。

基本用法

java
// 包装 FileWriter
try (BufferedWriter writer = new BufferedWriter(
        new FileWriter("output.txt"))) {
    writer.write("第一行");
    writer.newLine(); // 换行
    writer.write("第二行");
    writer.flush();
}

newLine() 的重要性

不同操作系统使用不同的换行符:

平台newLine() 写入write("\n") 写入
Windows\r\n\n(不一致!)
Linux\n\n(一致)
macOS(新版)\n\n(一致)
java
// ❌ 不用 newLine():Windows 上文件可能显示不对
writer.write("line1");
writer.write("\n");
writer.write("line2");
writer.write("\n");

// ✅ 用 newLine():跨平台正确
writer.write("line1");
writer.newLine();
writer.write("line2");
writer.newLine();

写入操作

java
try (BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(
            new FileOutputStream("output.txt"), StandardCharsets.UTF_8))) {
    // 写字符串
    writer.write("Hello");
    writer.newLine();

    // 写字符数组
    char[] chars = {'W', 'o', 'r', 'l', 'd'};
    writer.write(chars);
    writer.newLine();

    // 写字符串的一部分
    writer.write("Hello World", 0, 5); // 写 "Hello"
    writer.newLine();

    // 批量写入
    List<String> lines = List.of("Line 1", "Line 2", "Line 3");
    for (String line : lines) {
        writer.write(line);
        writer.newLine();
    }
}

实战:写入 CSV 文件

java
public static void writeCsv(String path, List<String[]> rows)
        throws IOException {
    try (BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(
                new FileOutputStream(path), StandardCharsets.UTF_8))) {
        for (String[] row : rows) {
            writer.write(String.join(",", row));
            writer.newLine();
        }
    }
}

// 使用
List<String[]> data = List.of(
    new String[]{"name", "age", "city"},
    new String[]{"张三", "25", "北京"},
    new String[]{"李四", "30", "上海"}
);
writeCsv("users.csv", data);

文本文件拷贝的标准组合

java
public static void copyTextFile(String src, String dst) throws IOException {
    try (
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(
                new FileInputStream(src), StandardCharsets.UTF_8));
        BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(
                new FileOutputStream(dst), StandardCharsets.UTF_8))
    ) {
        String line;
        while ((line = reader.readLine()) != null) {
            writer.write(line);
            writer.newLine();
        }
    }
}

这个模式是文本文件处理的「万能公式」:

readLine() → 处理 → write() + newLine()

缓冲区大小的选择

java
// 默认 8KB 缓冲区(8192 字符)
BufferedWriter writer = new BufferedWriter(
    new FileWriter("output.txt"));

// 自定义缓冲区大小
BufferedWriter writer = new BufferedWriter(
    new FileWriter("output.txt"),
    16384); // 32KB 缓冲区

对于大文件写入,适当增大缓冲区可以减少系统调用次数。但过大的缓冲区(如 1MB)反而浪费内存。

常用方法速查

方法说明
write(int c)写 1 字符
write(char[] cbuf)写字符数组
write(String s)直接写字符串
newLine()写入平台无关的换行符
flush()刷新缓冲区到磁盘
close()关闭流(自动 flush,自动关闭底层流)

记住这个原则

BufferedWriter = 缓冲写入 + newLine() 跨平台换行。 写文本文件,永远用它。

基于 VitePress 构建