close() 会自动 flush,但仅在正常执行到该语句时生效;若异常提前退出或忘记调用,则数据可能丢失;推荐使用 try-with-resources 确保刷新和关闭。

必须在 close() 之前显式调用 flush(),或者依赖 close() 自动刷新——但前提是没发生异常导致提前退出。
close() 会自动 flush,但只在正常执行到它时才生效
Java 的 BufferedWriter.close() 方法内部会先调用 flush(),再关闭底层流。所以只要代码能顺利执行到 bw.close() 这一行,缓冲区数据就一定落盘。
- 如果写入中途抛出异常(比如磁盘满、权限不足),且没有
try-catch捕获并处理,程序可能直接跳出,close()就不会被执行 - 如果忘记写
close()(常见疏漏),缓冲区数据永远留在内存里,文件为空或内容不全
推荐用 try-with-resources 确保刷新和关闭
这是最安全、最简洁的方式。JVM 保证无论是否异常,都会自动调用 close(),从而触发刷新。
- 语法简洁,无需手动写
finally块 - 资源在作用域结束时自动释放,避免遗漏
- 即使
write()抛异常,close()仍会被调用
示例:
立即学习“Java免费学习笔记(深入)”;
try (BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {
bw.write("hello");
bw.newLine();
bw.write("world");
// 即使这里抛 RuntimeException,close 仍会执行
} catch (IOException e) {
e.printStackTrace();
}
手动 flush() 的适用场景
不是为了“确保 close 刷新”,而是为了在关闭前主动落盘,比如:
- 写日志时希望实时可见,不能等 close
- 长时间运行的程序,需分段保存中间结果
- 调试阶段想确认某次写入已生效
注意:频繁 flush() 会抵消缓冲优势,降低性能。一般只在必要时机调用一次,或配合业务节奏使用。
别忽略底层 Writer 的异常传播
flush() 和 close() 都可能抛 IOException,尤其是刷盘失败时(如磁盘已满、文件被占用)。如果只捕获了 write() 的异常,而没处理 close() 的异常,可能误以为写入成功。
- 用 try-with-resources 可让编译器强制检查,异常不会被吞掉
- 若手动管理,应在
finally中调用close(),并单独捕获其异常


















