能,BufferedWriter.write()可直接写入拼接好的字符串,最常用且推荐;无需转字符数组,避免内存浪费与代理对越界;需注意补换行符、及时flush/close、特殊字符兼容性。

BufferedWriter.write() 能不能直接写入拼接好的字符串?
能,而且这是最常用、最推荐的做法。BufferedWriter.write() 本身接受 String 参数,不需要拆成字符数组或逐个字符写。只要字符串不是超大(比如几百 MB),直接传进去就行,BufferedWriter 内部会按缓冲区大小分批刷到底层流。
为什么别用 write(char[], offset, length) 来“手动优化”拼接?
有人看到 write(char[]) 重载方法,误以为手动转成字符数组再写更“底层”或更快——实际完全没必要,还容易出错:
-
String.toCharArray()会额外复制一份字符数组,白占内存 - 如果字符串含代理对(比如 emoji),自己算
offset和length极易越界或截断 -
BufferedWriter.write(String)底层就是调用String.getChars(),效率没差别
直接传 String 更安全、更简洁、JVM 还可能做内联优化。
必须注意的三个细节
看似简单,但线上出过不少问题,集中在以下三点:
- 拼接后的字符串末尾没换行符?
write()不自动加\n,得自己补:writer.write("hello" + System.lineSeparator()); - 忘记调用
flush()或close()?缓冲区内容可能滞留不落盘,尤其程序非正常退出时数据丢失 - 字符串含特殊字符(如
\u0000)且目标是文本文件?一般没问题;但若后续被 C 程序读取,可能被当成字符串结束——这不是write()的问题,而是协议层面要约定好编码和终止方式
一个稳妥的写法示例
假设你要写一段 JSON 拼接结果:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("data.json"))) {
String json = "{\"name\":\"Alice\",\"age\":" + age + "}";
writer.write(json);
writer.newLine(); // 比硬写 "\n" 更跨平台
writer.flush(); // close() 会 flush,但显式调用更可控
}
真正容易被忽略的是:newLine() 不等于 "\n",它根据系统返回 System.lineSeparator();而很多日志分析工具依赖标准换行,硬写 "\n" 在 Windows 上可能被识别为“无换行”,导致多行日志挤成一行。











