要实现高吞吐的特定编码文本导出,需按 fileoutputstream → outputstreamwriter(utf-8) → bufferedwriter 顺序组合,由 outputstreamwriter 负责编码转换、bufferedwriter 负责字符级缓冲,合理设置缓冲区大小(如 64kb)并批量写入,避免拼接开销与重复创建实例。

要实现高吞吐的特定编码文本导出,核心是让 OutputStreamWriter 负责编码转换,BufferedWriter 负责缓冲写入,二者组合使用可显著减少系统 I/O 调用次数,同时确保字符编码准确。
编码与缓冲分工明确
OutputStreamWriter 是 Writer 的子类,它把字符流按指定编码(如 UTF-8、GBK)转为字节流;BufferedWriter 则在字符层面做缓冲,避免每次 write() 都触发底层写操作。两者不能颠倒顺序:必须是 BufferedWriter → OutputStreamWriter → FileOutputStream,否则缓冲无效。
- 错误写法:
new OutputStreamWriter(new BufferedWriter(...))—— 编码器收不到完整字符块,缓冲失效 - 正确链路:
FileOutputStream → OutputStreamWriter(UTF-8) → BufferedWriter
合理设置缓冲区大小
BufferedWriter 默认缓冲区为 8192 字符(约 8KB),对大多数场景够用。但若导出超大文件(如百万行日志或报表),可适当增大缓冲区(如 64KB),减少 flush 次数;注意不要盲目设过大(如 >1MB),否则内存占用上升且可能延迟数据落盘。
- 示例:
new BufferedWriter(new OutputStreamWriter(out, "UTF-8"), 65536) - 若每行平均 100 字符,64KB 缓冲 ≈ 可暂存 600+ 行,平衡内存与吞吐
批量写入 + 手动控制 flush
避免逐行调用 write(line + "\n") 后立即 flush()。应累积多行再写,或依赖缓冲区自动溢出刷新。关键点:
- 用
write(char[])或write(String)批量写入,比单字符/小字符串高效 - 导出结束前调用
flush()确保剩余内容写出;close()会自动 flush,但显式 flush 更可控 - 如需实时查看(如日志),可定期(如每万行)
flush(),而非每行都刷
规避常见性能陷阱
看似简单组合,容易因细节拖慢速度:
- 不用
String.concat()或+拼接长行,改用StringBuilder预分配容量 - 避免在循环内重复创建
OutputStreamWriter或BufferedWriter实例 - 若目标是标准输出(
System.out),不建议套缓冲——它本身已缓冲,再套一层收益小还可能干扰行为 - GBK 等双字节编码下,单个中文字符占 2 字节,缓冲区按字符计,实际字节占用翻倍,需留意
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











