1. 使用原生 Java

✅ 最简单直接的方式就是使用 JDK 自带的 StringReader

这个类是 java.io.StringReader,专为将字符串转为 Reader 而设计,开箱即用,无需额外依赖。

@Test
public void givenUsingPlainJava_whenConvertingStringIntoReader_thenCorrect() throws IOException {
    String initialString = "With Plain Java";
    Reader targetReader = new StringReader(initialString);
    targetReader.close();
}

⚠️ 注意:虽然示例中调用了 close(),但 StringReader 实际上不持有外部资源,关闭它是良好的编码习惯,但不影响资源泄露。

💡 小结:如果你项目里不用 Guava 或 Commons IO,这是最推荐的方式——简单粗暴,零依赖。


2. 使用 Guava

✅ 如果你已经在用 Google Guava,可以借助 CharSource 这个抽象来构建 Reader

CharSource.wrap(String) 是一个轻量级封装,返回一个字符源,然后通过 openStream() 获取 Reader 实例。

@Test
public void givenUsingGuava_whenConvertingStringIntoReader_thenCorrect() throws IOException {
    String initialString = "With Google Guava";
    Reader targetReader = CharSource.wrap(initialString).openStream();
    targetReader.close();
}

📌 优势:

  • CharSource 提供了丰富的文本处理 API,适合需要链式操作或统一处理不同来源文本的场景
  • 更具扩展性,比如后续可以轻松切换到文件、URL 等源

⚠️ 踩坑提醒:别忘了调用 close(),Guava 的 Reader 是基于底层 IO 的,不关闭可能导致资源未释放。


3. 使用 Apache Commons IO

✅ 如果项目中已引入 Commons IO,可以使用 CharSequenceReader

它和 StringReader 功能类似,但支持任意 CharSequence(如 StringBuilderStringBuffer),灵活性更高。

@Test
public void givenUsingCommonsIO_whenConvertingStringIntoReader_thenCorrect() throws IOException {
    String initialString = "With Apache Commons IO";
    Reader targetReader = new CharSequenceReader(initialString);
    targetReader.close();
}

📌 特点:

  • 来自 org.apache.commons.io
  • 构造函数接受 CharSequence,不限于 String
  • 在处理动态字符串或接口设计更通用时更有优势

📌 示例中使用的邮箱地址为 mock 数据:dev@example.com


总结对比

方式 是否需要依赖 灵活性 推荐场景
✅ 原生 Java (StringReader) ❌ 无 一般 日常使用,轻量级项目
✅ Guava (CharSource) ✅ 需要 guava 已使用 Guava 的项目,需统一文本源管理
✅ Commons IO (CharSequenceReader) ✅ 需要 commons-io 较高 需支持多种 CharSequence 的场景

🔚 最终建议:优先使用原生 StringReader,除非你已经在用 Guava 或 Commons IO,再考虑对应方案。避免为了一个小功能引入大依赖,得不偿失。


原始标题:Java - String to Reader | Baeldung