直接写入字符数组片段更高效,因其减少方法调用、避免临时对象创建和冗余编码,并精准控制写入范围、减少内存拷贝,还能与缓冲区机制深度协同提升批量写入性能。
![java中 bufferedwriter 的 write(char[], off, len) 批量写入字符数组的性能优势](https://img.php.cn/upload/article/001/242/473/178426964462319.jpeg?x-oss-process=image/resize,p_40)
直接写入字符数组片段(write(char[], off, len))比逐个字符或拼接字符串写入更高效,核心在于减少方法调用开销、避免临时对象创建,并让缓冲区真正发挥作用。
避免字符串拼接与编码重复转换
如果先用 String.join 拼成大字符串再 write(String),JVM 需要:把每个字符串转为 char[] → 合并 → 再整体编码为字节 → 写入底层流。而直接传入已有的 char[] 片段,跳过了字符串构造和冗余编码步骤,尤其在处理日志行、CSV 字段、JSON 片段等原始字符数据时优势明显。
精准控制写入范围,减少内存拷贝
write(char[] cbuf, int off, int len) 不会复制整个数组,只按索引和长度引用原数组的指定区间。相比 write(new String(cbuf, off, len)),它省去了新建 String 对象、触发 GC 的压力,也避免了额外的 char[] 内存分配。对复用缓冲区(如环形缓冲、预分配字符数组)的场景特别友好。
与缓冲区机制深度协同
- BufferedWriter 的缓冲本质是维护一个内部 char[],
write(char[], off, len)可以批量拷贝数据到该缓冲区,触发一次缓存填充,而非多次小写入导致频繁 flush 或未充分利用缓冲区空间 - 当
len接近缓冲区剩余容量时,能自然触发一次底层 flush;若len很小,也比反复调用write(int c)减少方法栈开销和边界检查次数 - 配合
newLine()使用时,换行符直接追加到缓冲区末尾,无需额外字符串 + write 操作
实际使用建议
- 读取文本解析后得到 char[](如用
String.toCharArray()一次获取),优先用write(cbuf, 0, cbuf.length),而不是write(str) - 处理固定结构数据(如每行 128 字符的日志),预分配足够大的 char[],循环填充后直接 write 片段,避免 String 构造
- 不要为了用这个方法而强行拆分字符串——若原始数据已是 String 且数量不多,
write(String)更清晰;性能差异在万级写入才显著体现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











