CharArrayReader和CharArrayWriter是Java中专用于内存字符数组读写的轻量级流工具,不涉及I/O、零拷贝、响应快;前者从char[]读取并支持mark/reset,后者向动态扩容的char[]写入并提供toCharArray()/toString()获取结果,常配合使用实现内存内字符流管道,适用于适配Reader/Writer接口的场景。

CharArrayReader 和 CharArrayWriter 是 Java 中用于在内存中操作字符数组的轻量级流工具,它们不涉及文件或网络 I/O,只在 JVM 堆内存中读写 char 数组,适合临时缓存、字符串拼接、中间转换等场景。
CharArrayReader:从 char 数组读取字符
它把一个已有的 char 数组当作输入源,提供类似 Reader 的接口(如 read()、read(char[], int, int)、skip()、ready() 等),支持标记(mark/reset)功能。
使用时注意:
- 构造时传入 char 数组,可选指定起始偏移和长度;不传则默认读整个数组
- 内部维护一个 position 指针,每次 read() 后自动后移;调用 reset() 可回到上次 mark 的位置(需先 mark(int readAheadLimit))
- 数组内容不会被复制,只是引用 —— 外部修改数组会影响 Reader 行为(通常建议只读,避免并发修改)
示例:
立即学习“Java免费学习笔记(深入)”;
char[] data = {'H', 'e', 'l', 'l', 'o'};CharArrayReader reader = new CharArrayReader(data);
int c;
while ((c = reader.read()) != -1) {
System.out.print((char)c); // 输出 Hello
}
CharArrayWriter:向 char 数组写入字符
它内部维护一个可动态扩容的 char 数组,提供 write() 方法写入单个字符、字符数组或字符串,并可通过 toCharArray() 或 toString() 获取结果。
关键点:
- 初始容量默认为 32,写满时自动扩容(按 2 倍增长),无需手动管理大小
- write(String) 会把字符串转为 char[] 再写入;write(char[]) 直接拷贝内容
- toCharArray() 返回当前内部数组的副本(安全,不影响后续写入);toString() 返回 String 对象
- 调用 reset() 可清空所有已写内容,重置 size 为 0,但底层数组仍保留(避免频繁重建)
示例:
立即学习“Java免费学习笔记(深入)”;
CharArrayWriter writer = new CharArrayWriter();writer.write("Hel");
writer.write('l');
writer.write("o");
System.out.println(writer.toString()); // Hello
System.out.println(writer.toCharArray().length); // 5
配合使用:实现内存中的字符流管道
两者常组合使用,比如将一段处理逻辑封装成“读–处理–写”流程,完全避开磁盘或 socket。
- 先用 CharArrayWriter 收集输出,再用其 toCharArray() 构造 CharArrayReader 进行二次解析
- 适合模板渲染、XML/JSON 片段生成与校验、编码转换中间缓存等
- 比直接拼接 String 更高效(避免大量不可变对象创建),又比 StringBuilder 少一层抽象(无 append(),只有 write())
注意:它们不是线程安全的,多线程访问需外部同步。
替代方案与适用边界
现代代码中,多数简单场景可用 StringBuilder / String 直接替代;但当需要对接基于 Reader/Writer 的 API(如 XML 解析器、字符流过滤器、某些框架的处理器)时,CharArrayReader/Writer 就不可替代。
- 若只需构建字符串 → 优先用 StringBuilder
- 若要塞进某方法参数类型是 Reader → 用 CharArrayReader
- 若某接口要求 Writer 输出且你只想暂存到内存 → 用 CharArrayWriter
- 不推荐用于大文本(几 MB 以上),因全量驻留内存,且无缓冲优化
它们本质是 JDK 提供的“适配器”,让 char[] 能无缝融入 Java I/O 流体系。


















