stringreader 是 java 中将字符串直接作为字符输入流的轻量级工具类,无需 i/o 操作,适合适配要求 reader 参数的 api;它不复制字符串、不支持 mark/reset、构造时需非 null 校验,且对超大字符串需谨慎使用。

StringReader 是 Java 中 java.io 包提供的一个字符输入流类,它把字符串当作源,直接在内存中构建一个可读的字符流,无需读取文件或网络资源。它实现了 Readable 和 Closeable 接口,适合用于需要 Reader 类型参数但数据已存在于字符串中的场景(比如解析 XML、JSON 或模板渲染)。
StringReader 的基本用法
创建 StringReader 很简单,只需传入一个非 null 字符串:
- 构造时字符串内容被整体加载进内存,后续读取只是按需返回字符,不涉及 I/O 操作
- 不需要关联文件或外部资源,因此打开和关闭开销极小
- 虽然实现了
Closeable,但调用close()实际上什么也不做(可省略,但建议保留以符合流使用习惯)
典型读取方式:单字符、字符数组、配合 BufferedReader
你可以像操作其他 Reader 一样读取 StringReader:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
read()逐个读取 int 类型字符(-1 表示结束) - 用
read(char[] cbuf)批量填充字符数组 - 更常用的是包装成
BufferedReader,支持readLine()和缓冲提升效率
String text = "Hello\nWorld\nJava";
StringReader sr = new StringReader(text);
BufferedReader br = new BufferedReader(sr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close(); // 推荐关闭,尽管无实际影响
注意点与常见误区
使用 StringReader 时需留意几个关键细节:
- 字符串在构造时就被引用,StringReader 不会复制内容,但也不会修改原字符串(String 本身不可变)
- 不支持
mark()/reset(),除非显式调用markSupported()判断——StringReader 默认返回false - 如果字符串为 null,构造会抛出
NullPointerException,务必提前校验 - 不适合超大字符串(如几百 MB),虽在内存中,但会额外持有引用,可能影响 GC
替代方案对比:什么时候选 StringReader?
相比其他方式,StringReader 的定位很明确:
- 比
new InputStreamReader(new ByteArrayInputStream(str.getBytes()))更轻量、更语义清晰(避免编码问题和字节转换) - 比
CharSequenceReader(Apache Commons)更标准,无需引入第三方依赖 - 若只需一次性遍历,也可考虑
str.chars().forEach(...)(Stream API),但无法对接要求 Reader 的老接口
当你需要把字符串“伪装”成一个标准字符输入流来适配已有 API(如 SAXParser、Freemarker Template 工具类等),StringReader 就是最直接的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










