nChars 是 BufferedWriter 缓冲区的固定容量上限,等于 char[] 数组 cb 的长度,用于硬性判定写入边界;nextChar 为当前写入游标,一旦 ≥ nChars 即触发 flushBuffer(),而非按剩余空间估算。

nChars 是 BufferedWriter 内部缓冲区的容量上限,它不表示当前已写入字符数,而是定义缓冲区能容纳多少个 char —— 即 cb.length。它在定位缓存写入边界时起的是“硬性容量标尺”作用,而非动态水位线。
nChars 的本质是缓冲区长度,不是已用长度
-
cb是char[]数组,nChars = cb.length,由构造时指定或取默认值8192 -
nextChar才是实时游标:指向下一个待写入位置(范围为0到nChars) - 写入前判断
nextChar >= nChars,即“再写一个就溢出”,此时必须刷新缓冲区
if (nextChar >= nChars) {
flushBuffer(); // 把已有内容刷到底层 out,再重置 nextChar = 0
}
cb[nextChar++] = c; // 安全写入缓冲区满的判定逻辑严格依赖 nChars
- 不是“剩余空间 < 当前写入长度”才刷,而是只要
nextChar触达nChars就刷 - 即使只差 1 个位置,新写入一个字符也会触发刷新;不会尝试“部分填充”或“拆分写入”
- 对
write(char[], off, len)同样适用:先检查nextChar + len > nChars,满足则先刷再写
实际影响与常见误区
❌ 误以为
nChars是“已用字符数” → 它恒等于缓冲区总大小,不变❌ 以为可以靠
nChars - nextChar估算“还剩多少”来手动控制 → 虽然数学上成立,但BufferedWriter不暴露该计算供业务干预-
✅ 正确用法:接受其自动边界控制,必要时调用
flush()主动清空,避免依赖close()隐式刷新(防止异常时丢失数据)立即学习“Java免费学习笔记(深入)”;
缓冲区大小设得太小(如 128),会导致频繁刷新,抵消缓冲收益
设得过大(如 1MB),可能增加内存占用和延迟持久化风险,尤其在程序崩溃或未
close()时
本质上,nChars 就是一道不可逾越的数组边界墙,nextChar 是贴着墙走的指针,越界即刷新——机制简单、确定、无歧义。


















