bufferedoutputstream通过默认8192字节内存缓冲区将多次小写合并为批量写出,减少i/o次数;数据先写入缓冲区,满时自动flush,或调用flush()/close()强制写出。

BufferedOutputStream 通过在内存中维护一块固定大小的字节数组缓冲区(默认 8192 字节),把原本多次小量的磁盘写入,转为一次批量写出,从而减少系统调用和硬盘 I/O 次数。
缓存写入的核心机制
它本身不直接操作文件,而是包装一个底层 OutputStream(如 FileOutputStream)。所有 write() 调用的数据,先被拷贝进内部缓冲区数组,而不是立刻落盘:
- 数据写入时,仅填充缓冲区,不触发实际磁盘写入
- 缓冲区未满时,write() 只是移动内部指针(count)并复制字节
- 真正写入文件的动作被延迟,直到满足刷新条件
数据何时真正写入文件
缓冲区内容不会一直停留内存中,以下任一情况会触发“刷新”(flush),即把缓冲区剩余数据全部交给底层流写出:
- 缓冲区已满(达到容量上限,如 8192 字节),自动 flush 并清空缓冲区
- 显式调用 bos.flush(),强制立即写出当前缓冲区所有数据
- 调用 bos.close(),关闭前自动执行一次 flush(所以 close 前通常无需手动 flush)
如何控制缓冲区大小
构造时可指定缓冲区容量,更贴合业务场景:
- 默认构造:BufferedOutputStream(out) → 使用 8192 字节缓冲区
- 自定义大小:BufferedOutputStream(out, 4096) → 设为 4KB,适合小块高频写入
- 注意:size ≤ 0 会抛 IllegalArgumentException
典型使用步骤(避免数据丢失)
关键点在于理解 flush 和 close 的协作关系:
- 创建 FileOutputStream 绑定目标文件
- 用它构造 BufferedOutputStream
- 反复调用 write() 写入数据(全在内存缓冲)
- 确保最终调用 close() —— 它会自动 flush 剩余数据并释放资源
- 若需中途确认数据已落盘(如日志关键点),可主动调用 flush()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











