stringreader是java中专用于从字符串读取字符的轻量级只读字符流,继承自reader,支持单字符或批量读取,纯内存操作,常作为字符串与需reader参数的api(如xml/json解析器)之间的桥梁。

Java 中把字符串转成 Reader,最直接的方式就是用 StringReader,它是 java.io.Reader 的子类,专为读取字符串内容设计。
StringReader 是什么
StringReader 是一个轻量级的、只读的字符流,内部封装了字符串,支持按字符或字符数组方式读取。它不涉及文件或网络 I/O,纯内存操作,适合测试、解析、临时处理字符串内容。
基本用法:构造和读取
创建 StringReader 很简单,只需传入字符串;读取时常用 read() 或 read(char[]) 方法:
- 构造:
new StringReader("hello world") - 单字符读取:
int ch = reader.read(),返回字符的 int 值,读完返回 -1 - 批量读取:
reader.read(buffer, offset, length),更高效 - 别忘了
close()—— 虽然对StringReader实际无资源释放作用,但符合流使用规范
配合其他 API 使用(比如 XML/JSON 解析)
很多需要 Reader 输入的库(如 javax.xml.parsers.DocumentBuilder、com.fasterxml.jackson.databind.JsonNode)都接受 Reader 参数。这时 StringReader 就是桥梁:
- XML 解析示例:
builder.parse(new StringReader(xmlStr)) - Jackson JSON 解析:
mapper.readTree(new StringReader(jsonStr)) - 避免先写文件再读取,节省 I/O 和临时存储
注意点和替代方案
StringReader 是线程不安全的,且不支持 mark/reset(除非手动包装成 BufferedReader)。如果需要重读或跳转,可考虑:
- 用
new BufferedReader(new StringReader(str))启用mark()和reset() - JDK 11+ 可用
String.chars()或str.lines()做函数式处理,但不等价于Reader流语义 - 不要用
InputStreamReader+ByteArrayInputStream绕路转换,效率低且易编码问题
不复杂但容易忽略。只要记住:字符串 → StringReader → 交给需要 Reader 的组件,就对了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











