stringreader是java中将字符串作为字符输入流读取的工具类,用于内存字符串的逐字符或批量读取,常配合bufferedreader实现按行处理,但不支持reset、线程不安全,java 11+可用string.lines()替代简单场景。

StringReader 是 Java 中用于将字符串当作字符输入流(Reader)来读取的工具类,属于 java.io 包。它不操作文件或网络,而是把内存中的字符串“伪装”成一个可逐字符或批量读取的流,常用于需要 Reader 参数但只有字符串数据的场景(比如解析 XML、JSON 或自定义文本处理器)。
基本用法:创建并读取
只需传入字符串构造 StringReader,然后调用 read() 或 read(char[]) 方法:
-
read()每次返回一个int(字符 Unicode 值),读到末尾返回-1 -
read(char[] cbuf)批量读入字符数组,返回实际读取的字符数,读完也返回-1
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
String text = "Hello世界";
try (StringReader reader = new StringReader(text)) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
}
// 输出:Hello世界
配合其他 API 使用(如 BufferedReader)
StringReader 经常作为底层流,包装成更易用的装饰器,比如 BufferedReader,支持按行读取:
String lines = "第一行\n第二行\n第三行";
try (BufferedReader br = new BufferedReader(new StringReader(lines))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(">> " + line);
}
}
// 输出:
// >> 第一行
// >> 第二行
// >> 第三行
注意点和常见陷阱
-
不支持 reset() 和 mark()/reset()(除非显式调用 mark(int)):默认不支持回退,若需重读,应重新创建
StringReader实例 -
线程不安全:多个线程同时读取同一个
StringReader实例可能导致状态错乱,建议每个线程独用一个实例 -
关闭无实际作用,但推荐 try-with-resources:虽然
close()不释放资源(字符串已在内存中),但符合流使用规范,且防止误用其他可能依赖 close 的装饰器
替代方案(Java 11+)
如果只是简单读取字符串内容,Java 11 引入了 String.lines() 流式 API,更简洁:
"第一行\n第二行".lines().forEach(System.out::println);
但它不提供流式控制(如跳过、标记、异常恢复等),灵活性不如 StringReader + BufferedReader 组合。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










