应使用BufferedWriter封装OutputStreamWriter(指定UTF-8),避免循环中flush和字符串拼接,改用String.format或批量累积写入,配合try-with-resources确保资源释放。

用 Writer 接口逐行写入变量文本,关键不在“逐行”本身,而在避免高频小写带来的性能损耗。核心思路是:用带缓冲的 Writer 承载内容,控制 flush 时机,把字符串拼接开销降到最低。
选对 Writer 实现类:BufferedWriter 是首选
直接使用 FileWriter 效率低,因为它每次 write() 都可能触发一次系统调用。BufferedWriter 内部维护一个字符缓冲区(默认 8192 字节),只有缓冲区满、调用 flush() 或 close() 时才真正落盘。
- 构造时套一层 BufferedWriter:new BufferedWriter(new FileWriter("out.txt"))
- 写入用 write(String) + newLine(),别用 println()(它内部会 flush)
- 全程避免在循环里调用 flush(),让 close() 自动完成最终刷盘
减少字符串拼接开销:别在 write 前拼整行
很多性能瓶颈其实不出在 I/O,而在于反复用 + 或 StringBuilder.append() 拼接每行内容。尤其当某行含多个变量时,如 "id=" + id + ",name=" + name + ",ts=" + ts,会生成大量临时对象。
- 改用 String.format("id=%d,name=%s,ts=%d", id, name, ts),更简洁且 JVM 有优化
- 若格式固定、变量多,可预编译 MessageFormat 或用小型模板工具(如 StrSubstitutor)
- 极端场景下,用 CharArrayWriter 先累积所有行到内存 char[],再一次性 write 到 BufferedWriter —— 适合需复用中间结果或对接 Writer 接口的遗留组件
批量写入比逐行更高效:按块组织输出
80K 行不是必须逐次调用 write()。可每 1000 行合为一个大字符串,再 write 一次。这样方法调用次数从 80K 降到 80,显著降低 JVM 开销。
- 用 StringBuilder 累积若干行,注意提前预估容量(如每行平均 50 字符 × 1000 = 50KB),避免频繁扩容
- 累积满阈值后,调用 bufferedWriter.write(sb.toString()),然后 sb.setLength(0) 重用
- 循环结束后,别忘处理剩余未满块
编码与资源管理:细节决定稳定性
Writer 默认编码依赖平台,跨环境易出乱码。显式指定 UTF-8,并确保资源正确释放。
- 用 FileWriter 构造时传入 Charset:new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8)
- 务必用 try-with-resources 包裹:try (BufferedWriter w = ...) { ... },close() 会自动 flush 并释放句柄
- 不建议手动调用 flush(),除非需要确保某批数据已落盘(如日志实时可见)


















