Files.newBufferedWriter直接返回BufferedWriter,需显式指定Charset(推荐UTF-8)、合理设置缓冲区大小(默认8192字符),配合try-with-resources确保自动flush和关闭;追加写必须传StandardOpenOption.APPEND。

用 Files.newBufferedWriter 实现带缓存的文本流式写入,核心在于它底层已封装了 BufferedWriter,无需手动包装,只需合理配置编码与缓冲区大小,并配合 try-with-resources 正确管理资源。
明确路径与字符编码,避免乱码和隐式转换
该方法默认使用 UTF-8(Java 11+),但显式指定更稳妥。若目标文件需兼容旧系统(如 Windows 记事本默认读取 ANSI),应传入 StandardCharsets.ISO_8859_1 或 Charset.forName("GBK");否则依赖默认值可能导致跨环境写入/读取不一致。
- 始终传入
StandardCharsets.UTF_8(推荐,通用性强) - 避免只传
Path不带Charset—— Java 8 中默认是平台编码,易出问题 - 示例:
Files.newBufferedWriter(path, StandardCharsets.UTF_8)
按需设置缓冲区大小,平衡内存与IO频次
构造时可传入自定义缓冲区容量(单位:字符数),默认为 8192。写入小量高频数据(如日志逐行写)可保持默认;若单次写入长文本(如 JSON 块、HTML 片段),适当调大(如 64*1024)能减少系统调用次数。
- 缓冲区不是越大越好:过大会延迟落盘,且占用堆内存
- 不建议小于 1024,否则抵消不了缓冲收益
- 示例:
Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND)后再 wrap 成new BufferedWriter(writer, 32 * 1024)—— 注意:这是冗余操作!newBufferedWriter本身已返回BufferedWriter,直接设缓冲大小需用重载方法: - 正确方式:
Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.WRITE)不支持直接设 buffer size;如需自定义大小,得手动构建:new BufferedWriter(Files.newWriter(path, StandardCharsets.UTF_8), 32 * 1024)
结合 try-with-resources 自动刷新与关闭,防止内容丢失
BufferedWriter 的缓冲内容只在缓冲区满、调用 flush() 或 close() 时才真正写入磁盘。未正常关闭会导致最后一段内容滞留在内存中丢失。
- 必须用 try-with-resources,确保异常时也执行
close() - 无需每行都
flush(),除非实时性要求极高(如监控日志) - 若需强制立即落盘(如关键状态记录),在
write()后加flush(),但会削弱缓冲优势 - 示例:
try (BufferedWriter w = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
w.write("name=alice"); w.newLine();
w.write("age=30"); w.newLine();
// close() 自动 flush
}
追加写入与覆盖策略要显式声明
newBufferedWriter 默认行为是覆盖(CREATE + TRUNCATE_EXISTING)。如需追加,必须显式传入 StandardOpenOption.APPEND,否则每次运行都会清空原文件。
- 追加模式下,即使缓冲区未满,新内容也会追加到文件末尾
- 注意:
APPEND和TRUNCATE_EXISTING互斥,不能同时存在 - 常见组合:
• 覆盖写:StandardOpenOption.CREATE, StandardOpenOption.WRITE
• 追加写:StandardOpenOption.CREATE, StandardOpenOption.APPEND











