bufferedwriter在缓冲区写满(nextchar == nchars)时自动刷新,是其提升性能的关键机制;默认8192字符缓冲区,通过nextchar跟踪写入量,满、flush或close时触发批量写入,避免频繁系统调用。

Java 中字符流(如 BufferedWriter)在缓冲区写满时会自动刷新,这是它提升性能的关键设计,无需手动干预。
缓冲区大小和“写满”的判定标准
BufferedWriter 默认使用 8192 个字符的缓冲区(即 char[8192]),每个 char 占 2 字节,实际内存占用约 16KB。它用一个内部变量 nextChar 记录当前已写入的字符数量(从 0 开始)。当 nextChar == nChars(即等于缓冲区总长度)时,就判定为“写满”,立刻触发刷新。
自动刷新发生的三种典型场景
-
缓冲区填满:比如连续调用
write()写入大量文本,直到nextChar达到 8192,此时底层自动调用flushBuffer(),把整个缓冲区内容批量写入底层Writer(如FileWriter) -
显式调用
flush():不管当前nextChar是多少,强制把已有内容刷出,nextChar重置为 0 -
调用
close():内部先执行一次flush(),确保剩余未满的数据也落盘,再关闭底层流
写入过程中的缓冲行为细节
以 write(char[], int, int) 为例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 如果待写入字符数 ≤ 剩余空间(
nChars - nextChar),直接拷贝进缓冲区,更新nextChar - 如果待写入字符数超过剩余空间,先填满当前缓冲区并刷新,再将剩余数据分批处理——可能绕过缓冲、直接写到底层流,也可能拆成多段填入新缓冲
这种机制既保证了“满即刷”的高效性,又避免了小数据频繁触发系统调用。
为什么不要每写一次就 flush
每次 write() 后都调用 flush(),等于让缓冲区失效:它会立即把当前内容写出并清空,相当于退化成无缓冲的 FileWriter,还多出方法调用和同步开销。实测表明,仅依赖自动满刷 + close 刷尾,性能通常是手动 flush 的 3~5 倍以上。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










