CharArrayReader 是 Java 中用于直接读取内存中 char[] 数组的轻量级字符输入流,无 I/O 开销、零拷贝、响应快,适用于需将已有字符数组作为 Reader 传入流式 API 的场景。

CharArrayReader 是 Java 中一个轻量级的字符输入流,专为在内存中读取已有的 char[] 数组而设计。它不涉及 I/O 操作,不依赖文件或网络,所有读取都在 JVM 堆内存中完成,因此开销极小、响应极快。
适用场景:什么时候该用 CharArrayReader?
当你已有字符数组(比如解析后的 JSON 字符串、模板片段、配置内容),又需要将其当作“可读的字符流”传给只接受 Reader 的 API(如 BufferedReader、XMLInputFactory.createXMLStreamReader(Reader)、某些解析器)时,CharArrayReader 就是最直接、零拷贝的选择。
常见情况包括:
- 将字符串转换为 char 数组后,再用流式方式逐行/逐字符处理(避免重复创建 String 对象)
- 单元测试中模拟外部文本输入源
- 在内存中拼接多个 char 片段,统一交给流式处理器消费
基本用法:构造与读取
构造时传入 char 数组即可,支持指定起始位置和长度(可选):
char[] data = "Hello, world!".toCharArray(); CharArrayReader reader = new CharArrayReader(data); // 读取全部 // 或指定范围: CharArrayReader partial = new CharArrayReader(data, 0, 5); // 仅 "Hello"
后续可配合 read()、read(char[] cbuf, int off, int len)、skip()、mark()/reset() 等标准 Reader 方法使用。注意:mark() 默认支持,但 markSupported() 返回 true 仅当构造时未指定 offset/length 或显式启用(JDK 实现中通常默认支持)。
性能优势与注意事项
相比 StringReader(内部仍会转成 char 数组),CharArrayReader 直接持有原始数组引用,无额外转换或复制;相比新建 String 再转为流,它避免了字符串不可变性带来的对象开销。
需留意:
- 数组内容在 reader 生命周期内不应被外部修改,否则行为未定义
- 它不是线程安全的,多线程并发读取需自行同步
- 不自动关闭资源(无底层通道),无需 try-with-resources,但建议用完后置 null 或丢弃引用便于 GC
替代方案对比:什么情况下不该用?
如果只是简单遍历字符,直接 for 循环访问 char 数组更高效;如果数据来自字符串且只需一次读取,StringReader 语义更清晰;若需编码转换(如从 byte[] 解码 UTF-8),应使用 InputStreamReader 配合 ByteArrayInputStream,而非 CharArrayReader(它只处理 char,不处理编码)。

















