调用 flush() 方法可手动刷新 BufferedOutputStream 缓冲区,立即将缓存数据写入底层流;适用于异常退出、关键数据落盘、需接收方即时感知等场景,且 flush 不关闭流、不清空缓冲区结构。

直接调用 flush() 方法就能手动刷新 BufferedOutputStream 的缓冲区,把当前缓存中还没写出去的数据立即写入底层输出流(比如文件或网络连接)。
什么时候必须手动 flush
不是所有情况都需要主动调用,但以下场景建议显式调用,避免数据丢失:
- 程序可能异常退出(如抛出未捕获异常),而你又没走到
close()那一步 - 写完关键数据后需要确保它已落盘(例如日志记录、配置保存)
- 写入过程中要让接收方(如另一个进程、网络服务端)立刻看到这部分内容
- 使用 try-with-resources 时,
close()会自动 flush,但若中间想提前确认数据已写出,仍需手动 flush
flush 的基本写法
只要拿到 BufferedOutputStream 实例,直接调用即可:
bos.flush(); // bos 是 BufferedOutputStream 对象
注意:调用 flush 不会关闭流,之后还能继续 write;也不会清空缓冲区结构,只是把当前已缓存的数据推到底层。
常见配合写法示例
典型安全写入模式(含异常处理):
try (FileOutputStream fos = new FileOutputStream("data.bin");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
bos.write("header".getBytes());
bos.flush(); // 确保 header 已写入
bos.write("payload".getBytes());
// 不调用 flush 也行,close 时会自动刷
} catch (IOException e) {
e.printStackTrace();
}
如果不用 try-with-resources,记得在 finally 块里先 flush 再 close:
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream("out.txt"));
bos.write("test".getBytes());
bos.flush(); // 主动刷一次
} finally {
if (bos != null) {
try {
bos.close(); // close 内部也会 flush,双重保障
} catch (IOException ignored) {}
}
}
flush 调用失败会怎样
flush() 声明抛出 IOException,说明它可能因底层设备不可用、磁盘满、网络中断等原因失败。实际开发中应捕获并处理,不能忽略:
- 记录错误日志
- 触发重试逻辑(如写入临时文件再迁移)
- 向用户提示“保存失败,请检查存储空间”
不处理 flush 异常,可能误以为数据已持久化,导致后续逻辑出错。










