chararraywriter 是基于可扩容char[]的内存字符写入器,适合动态拼接大量字符;支持多种write()重载、转字符串/数组、写入其他writer,但线程不安全。

CharArrayWriter 是 Java 中一个基于字符数组的内存写入器,适合在内存中动态拼接大量字符(尤其在无法预估最终长度、又希望避免频繁字符串拼接开销时)。它底层维护一个可扩容的 char[],写入操作高效,且支持转为字符串、字符数组或写入其他 Writer。
核心使用步骤
创建实例 → 多次写入(单字符、字符数组、字符串)→ 获取结果(toString() 或 toCharArray())
- 默认构造函数初始化容量为 32,自动扩容(类似 ArrayList),无需手动管理数组大小
- 支持多种
write()重载:可写入int(单字符)、char[]、String,也支持指定偏移和长度 - 写入过程不涉及编码/解码,纯字符层面操作,比
ByteArrayOutputStream + String更轻量
典型用法示例
比如拼接日志行、XML 片段或模板渲染结果:
CharArrayWriter writer = new CharArrayWriter();
writer.write("User: ");
writer.write("Alice");
writer.write(", Age: ");
writer.write(28); // write(int) 写入单个字符,注意:28 不是 '28',而是 Unicode 码位 28(非打印字符)
// ✅ 正确写入数字字符串:
writer.write(String.valueOf(28));
writer.write(", Tags: [");
String[] tags = {"admin", "active", "vip"};
for (int i = 0; i 0) writer.write(',');
writer.write(tags[i]);
}
writer.write(']');
String result = writer.toString(); // → "User: Alice, Age: 28, Tags: [admin,active,vip]"
注意事项与优化建议
-
不要用
write(int)直接写数字值:它写的是该整数对应的 Unicode 字符(如write(65)写入 'A'),不是数字字符串。写数字请先转String.valueOf(n) - 若已知大致长度,可用带初始容量的构造函数(
new CharArrayWriter(1024))减少扩容次数 - 写完后可调用
reset()清空内容并复用对象(避免反复 new),适合循环拼接场景 - 线程不安全,多线程环境下需自行同步或改用其他方案(如
StringBuilder配合局部变量)
对比 StringBuilder 的适用场景
CharArrayWriter 和 StringBuilder 都适合内存拼接,但定位略有不同:
- 需要最终输出为
Writer接口(例如作为PrintWriter目标、或传给接受Writer的 API)→ 选CharArrayWriter - 纯拼接+转字符串,且追求最简、最常用 →
StringBuilder更直观、社区习惯更强 - 需将拼接结果直接写入文件、网络流等 →
CharArrayWriter可通过writeTo(Writer)方法桥接,无需中间字符串对象










