BufferedWriter 的 close() 方法会自动调用 flush(),确保缓冲区数据写入底层流;这是 Writer 类设计契约和 Closeable 接口规范所要求的,无需手动 flush,推荐使用 try-with-resources 实现自动安全关闭。

Java 中所有实现了 Closeable 接口的类(包括 BufferedWriter)在 close() 执行时,必须完成资源清理并保证已写入缓冲区的数据不丢失。因此,close() 内部会先调用 flush(),再真正关闭底层流。
为什么 close 一定会 flush?
这是由 Writer 类的设计契约决定的:
-
BufferedWriter.close()继承自Writer.close(),而Writer.close()的 Javadoc 明确说明:“关闭流并释放与之关联的所有系统资源。在关闭前,会刷新缓冲区。” - 源码层面,
BufferedWriter.close()会先调用super.close()(即Writer.close()),而后者内部已包含flush()调用。 - 如果未 flush 就直接关闭,可能导致最后一段缓冲内容永久丢失——这违背了 IO 操作的可靠性原则。
手动 flush 和 close 的关系
你不需要、也不应该在 close() 前显式调用 flush()(除非有特殊需求,比如想提前刷盘但不关闭流):
-
bw.write("hello"); bw.close();→ “hello” 会被写出到文件 -
bw.write("hello"); bw.flush(); bw.close();→ 多余,close()已含 flush bw.write("hello"); // 忘记 flush 和 close → 数据可能滞留内存,永不落盘
使用 try-with-resources 是最佳实践
它能自动、安全地调用 close()(也就自动触发 flush()),避免因异常跳过关闭:
立即学习“Java免费学习笔记(深入)”;
try (BufferedWriter bw = Files.newBufferedWriter(Paths.get("out.txt"))) { bw.write("done"); }- 即使 write 抛异常,JVM 仍会执行
bw.close()→ 自动 flush + 关闭 - 等价于手动写
finally块中调用close(),但更简洁可靠
注意:flush 不等于“立即物理写盘”
flush()(以及 close() 中隐含的 flush)只是把 Java 缓冲区数据推送到操作系统缓冲区(如内核 page cache),不保证立刻写入磁盘:
- 若需强制落盘(例如防止断电丢数据),应配合
FileChannel.force(true)或使用Files.write(..., StandardOpenOption.SYNC) - 普通场景下,依赖
close()的自动 flush 已足够;强制同步会显著降低性能,慎用


















