调用 flush() 方法可手动强制将 bufferedoutputstream 缓冲区数据写入底层流并清空缓冲区;它不关闭流,仅推送未写出字节、重置缓冲区,适用于日志落盘、关键状态保存、异常防护及实时通信等场景。

调用 flush() 方法即可手动强制将 BufferedOutputStream 内部缓冲区中的数据写入到底层输出流(如 FileOutputStream 或网络流),并清空缓冲区。
flush 的作用和触发时机
flush() 不会关闭流,只负责把当前缓存中尚未写出的字节全部推送到下一层流,并重置缓冲区。它在以下情况特别关键:
- 写入数据后需要立即确保数据落盘(比如日志、关键状态保存)
- 底层流不自动 flush(例如普通
FileOutputStream) - 程序可能异常终止,需尽量减少数据丢失风险
- 与外部系统交互时要求“实时可见”(如 socket 通信中发送完整消息)
典型使用方式
创建时包装底层流,写完后显式调用 flush():
FileOutputStream fos = new FileOutputStream("data.bin");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("hello".getBytes());
bos.flush(); // ✅ 强制刷出缓冲区内容
// 此时 "hello" 已写入文件,即使 bos 还没 close
注意点
有些场景下仅靠 flush() 还不够:
-
文件系统级落盘不保证:
flush()只保证数据到达操作系统内核缓冲区,不一定已写入物理磁盘。如需强持久化,应配合fos.getFD().sync() -
close() 会自动 flush:调用
close()前会隐式执行一次flush(),但不能依赖它替代主动 flush —— 若中途需确认数据已送出,必须手动调用 - 多次 flush 安全但低效:频繁调用会削弱缓冲的意义,应按业务语义控制刷新节奏(如每条日志后、每个数据包后)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











