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() 跨平台换行。 写文本文件,永远用它。
