StringReader是Java中将字符串作为字符输入流读取的工具类,支持逐字符或批量读取,常用于解析、测试及内存内流式处理;它只读、无I/O开销、线程不安全,且不支持mark/reset。

StringReader 是 Java 中用于将字符串当作字符输入流(Reader)来读取的工具类,它让字符串可以像文件、网络响应等其他字符流一样被逐字符或批量读取,常用于解析、测试或中间处理场景。
核心用法:构造 + 读取
创建 StringReader 很简单,只需传入目标字符串:
- 使用
new StringReader("hello world")初始化 - 调用
read()读取单个字符(返回int,-1 表示结束) - 或用
read(char[] cbuf, int off, int len)批量读入字符数组 - 别忘了用完后调用
close()(虽然对StringReader实际无资源释放作用,但符合流使用规范)
常用读取方式示例
比如读取字符串 "Java":
StringReader sr = new StringReader("Java");
int ch;
while ((ch = sr.read()) != -1) {
System.out.print((char) ch); // 输出 J a v a
}
sr.close();
也可以配合 BufferedReader 提升效率,支持按行读取:
立即学习“Java免费学习笔记(深入)”;
StringReader sr = new StringReader("Line1\nLine2\nLine3");
BufferedReader br = new BufferedReader(sr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close(); // 会自动关闭底层 StringReader
注意事项和常见误区
StringReader 是只读的,不支持标记(mark)、重置(reset)等操作(除非手动启用 markSupported,但它默认返回 false);
- 它内部直接操作字符串的 char 数组,没有 I/O 开销,性能高
- 线程不安全,多线程并发读取需自行同步
- 不能写入,也不能修改原始字符串(字符串本身不可变)
- 如果需要可重读或支持 mark/reset,建议转为
CharArrayReader或先转成InputStream再包装
适用典型场景
适合在不需要真实 I/O 的情况下模拟流行为:
- 单元测试中向依赖
Reader的方法传入测试数据 - 解析内嵌的 JSON/XML 片段(配合 Jackson、DOM 解析器等)
- 配置文本、模板字符串的内存内流式处理
- 与
LineNumberReader配合做带行号的文本分析


















