chararrayreader 是 java 中用于从字符数组读取数据的轻量级 reader 实现,支持逐字符、批量读取和跳过操作,并默认支持 mark/reset 回到起始位置;现代开发更推荐 stringreader 或直接遍历字符数组。

CharArrayReader 是 Java 中一个轻量级的字符输入流,用于从字符数组(char[])中读取数据,它实现了 Reader 接口,适合在内存中处理字符串内容,无需文件或网络 I/O。
基本用法:创建并读取字符数组
只需传入一个 char[] 即可构造 CharArrayReader。它内部维护一个读取位置指针,支持逐字符、批量读取或跳过操作。
- 构造时可指定整个数组,也可指定起始偏移和长度(类似
String(char[], offset, length)) - 调用
read()返回下一个字符(int 类型,-1 表示流末尾) - 调用
read(char[] cbuf, int off, int len)批量读入目标数组,返回实际读取数量
常用读取方式示例
以下代码演示三种典型读取方式:
char[] data = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
try (CharArrayReader reader = new CharArrayReader(data)) {
// 方式1:逐字符读取
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch); // 输出 Hello World
}
<pre class="brush:java;toolbar:false;">// 方式2:批量读取到新数组
reader.reset(); // 重置位置(需先 mark() 或构造时支持 reset)
char[] buf = new char[5];
int n = reader.read(buf);
System.out.println("\n前5个字符:" + new String(buf, 0, n)); // Hello
// 方式3:跳过前6个字符
reader.skip(6);
char[] rest = new char[data.length - 6];
reader.read(rest);
System.out.println("跳过后剩余:" + new String(rest)); // World}
注意 mark/reset 和位置控制
CharArrayReader 默认支持 mark() 和 reset(),但需注意:
- 构造后默认已处于“可标记”状态,无需显式调用
mark(int) -
reset()可回到构造时或上次mark()的位置(即数组起始处) - 若中间执行了
skip()或多次read(),调用reset()会回到初始位置 - 不支持设置自定义标记读取限制(
mark()的参数被忽略)
替代方案建议
虽然 CharArrayReader 功能明确,但在现代 Java 开发中更推荐以下方式:
- 对字符串操作:直接用
StringReader(传入String,内部转为char[]) - 需要流式处理且逻辑简单:用
InputStreamReader包装ByteArrayInputStream(适用于字节转字符场景) - 仅需遍历字符:直接用 for-each 循环或
String.toCharArray()配合增强 for,避免引入流开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











