stringreader 是 java 中将字符串作为字符输入流处理的工具类,继承自 reader,支持 read()、skip()、mark/reset 等操作,适用于需 reader 接口的场景(如 xml/json 解析),只读、线程不安全,开销极小。

StringReader 是 Java 中用于将字符串内容当作字符输入流处理的工具类,它继承自 java.io.Reader,让你无需创建临时文件或进行 IO 操作,就能以流的方式逐个读取内存中的字符串。
核心用法:用字符串构造 StringReader
只需把目标字符串传给构造方法,就得到一个可读取的字符流:
- 构造时字符串被内部缓存,不会修改原字符串
- 支持
read()读单个字符、read(char[])批量读取、skip()跳过字符、mark()/reset()标记重置(需提前启用 markSupported) - 默认不支持 mark/reset;若需使用,需在构造后调用
mark(0)并确保缓冲区足够(实际中较少依赖该特性)
典型读取方式:配合循环或 try-with-resources
推荐用 try-with-resources 自动关闭(虽然 StringReader 关闭无实际资源释放,但符合规范):
String content = "Hello, World!";
try (StringReader reader = new StringReader(content)) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
}
也可读入字符数组提高效率:
char[] buf = new char[1024];-
int len = reader.read(buf);返回实际读取长度,-1 表示结束 - 注意:buf 中未读取部分保持原值,需根据返回的 len 处理有效数据
适用场景与注意事项
常用于需要 Reader 接口的 API,比如 XML 解析器(SAXParser.parse(new InputSource(reader)))、JSON 库(如 Jackson 的 JsonParser)、模板引擎等。
- 不能写入,只读;也不支持重新打开或重置到开头(除非用 mark/reset,且必须在读取前 mark)
- 线程不安全,多线程共享时需同步或各自创建实例
- 相比直接操作 String,优势在于统一了流式接口,便于和其它 Reader 组合(如 BufferedReader 包装提升读取效率)
替代方案对比
如果只是简单遍历字符串,直接用 String.charAt() 或增强 for 循环更轻量;但当目标 API 明确要求 Reader 时,StringReader 就是标准且简洁的选择。
不复杂但容易忽略:它让字符串“假装”成流,却完全运行在内存中,零磁盘 IO,开销极小。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











