StringReader 是 Java 中将字符串作为字符输入流读取的内存级 Reader 实现。它不涉及 I/O 资源,close() 为空操作;支持逐字符、逐行(配合 BufferedReader)或与 Scanner 等工具集成解析,适用于单元测试、配置解析及流式文本处理场景。

StringReader 是 Java 中用于将字符串当作字符输入流来读取的类,属于 java.io.Reader 的子类。它不涉及文件或网络,纯粹在内存中操作字符串,适合对字符串内容做逐字符、逐行或按需解析的场景。
StringReader 的基本用法
创建 StringReader 时传入一个字符串,之后可像读取普通文本流一样调用 read()、read(char[]) 或配合 BufferedReader 使用:
- 直接读取单个字符:返回
int(字符 Unicode 值),读到末尾返回-1 - 读取字符数组:指定偏移和长度,更高效
- 通常与
BufferedReader组合,支持readLine()按行读取
示例:
String text = "Hello\nWorld\nJava";
StringReader reader = new StringReader(text);
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
// 输出:
// Hello
// World
// Java
注意关闭资源(但实际可省略)
StringReader 不持有外部资源(如文件句柄、Socket 连接等),其 close() 方法为空实现,调用与否不影响功能。不过为保持代码风格统一,仍建议在 try-with-resources 中使用:
立即学习“Java免费学习笔记(深入)”;
- try-with-resources 会自动调用
close(),无副作用 - 避免和其他 Reader(如 FileReader)混用时遗漏关闭逻辑
推荐写法:
String content = "a,b,c";
try (StringReader sr = new StringReader(content);
BufferedReader br = new BufferedReader(sr)) {
String line = br.readLine();
System.out.println(line); // a,b,c
}
StringReader 和其他字符串处理方式的区别
对比常见替代方案,更能理解它的定位:
-
直接用 String 方法(如
split()、charAt()):简单场景够用,但缺乏流式抽象,难以复用已有基于 Reader 的工具(如LineNumberReader、XML 解析器) - ByteArrayInputStream + InputStreamReader:绕路,多一层编码转换,易出编码问题
- StringReader:零拷贝、无编码歧义、语义清晰——“我要把这段字符串当文本流来读”
典型适用场景
以下情况优先考虑 StringReader:
- 单元测试中模拟文件输入(例如把预期 XML/JSON 字符串喂给 SAX/DOM 解析器)
- 配置内容以字符串形式传入,需按行或按字段解析(如自定义 DSL)
- 与现有基于 Reader 的 API 集成(如
java.util.Scanner构造函数接受Readable)
例如用 Scanner 解析逗号分隔字符串:
String data = "apple,banana,cherry";
try (StringReader sr = new StringReader(data);
Scanner sc = new Scanner(sr)) {
sc.useDelimiter(",");
while (sc.hasNext()) {
System.out.println(sc.next().trim());
}
}


















