1. 概述

在本文中,我们将探讨如何使用 原生 Java、Guava 和 Apache Commons IO 三种方式,将一个普通的 String 转换为 InputStream

这类操作在处理文件模拟、网络请求体构造或 IO 流封装时非常常见,属于基础但高频的“踩坑点”之一。

本文是 Baeldung 系列教程 《Java – 回到基础》 的一部分。


2. 使用原生 Java 转换

最简单直接的方式是通过 ByteArrayInputStream,结合 String.getBytes() 将字符串转为字节数组,再包装成输入流。

✅ 示例代码如下:

@Test
public void givenUsingPlainJava_whenConvertingStringToInputStream_thenCorrect() 
    throws IOException {
    String initialString = "text";
    InputStream targetStream = new ByteArrayInputStream(initialString.getBytes());
}

⚠️ 注意:getBytes() 默认使用平台默认字符集(如 Windows 可能是 GBK,Linux 通常是 UTF-8),这可能导致跨平台乱码问题。

✅ 推荐做法:显式指定字符集,避免编码不一致:

InputStream targetStream = new ByteArrayInputStream(
    initialString.getBytes(StandardCharsets.UTF_8)
);

📌 总结:原生方式简单粗暴,无需依赖,但要注意字符编码控制。


3. 使用 Guava 转换

Guava 并没有提供直接的 String → InputStream 工具方法,但可以通过其 CharSourceByteSource 体系间接实现。

✅ 示例代码:

@Test
public void givenUsingGuava_whenConvertingStringToInputStream_thenCorrect() 
    throws IOException {
    String initialString = "text";
    InputStream targetStream = 
        CharSource.wrap(initialString)
                  .asByteSource(StandardCharsets.UTF_8)
                  .openStream();
}

🔍 解析流程:

  • CharSource.wrap(str):将字符串包装为字符源
  • .asByteSource(charset):转为字节源,并指定编码
  • .openStream():打开一个 InputStream

⚠️ 踩坑提醒:asByteSource() 方法被标记为 @Beta —— 这意味着它可能在未来版本中被移除或修改,不适合用于长期维护的生产项目。

✅ 适用场景:内部工具、临时脚本等对稳定性要求不高的地方。


4. 使用 Apache Commons IO 转换

Apache Commons IO 提供了最简洁的解决方案:IOUtils.toInputStream()

✅ 示例代码:

@Test
public void givenUsingCommonsIO_whenConvertingStringToInputStream_thenCorrect() 
    throws IOException {
    String initialString = "text";
    InputStream targetStream = IOUtils.toInputStream(initialString, StandardCharsets.UTF_8);
}

📌 支持重载方法:

  • toInputStream(String input, Charset charset)
  • toInputStream(String input, String charsetName)

❌ 注意事项:

  • 方法不会自动关闭流(本例中也不需要关闭,因为是内存流)
  • 仍建议在实际使用中配合 try-with-resources 使用,养成好习惯

✅ 优点:

  • API 简洁清晰
  • 显式支持编码设置
  • 成熟稳定,广泛应用于企业级项目

📦 依赖添加(Maven):

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

5. 总结

方式 是否推荐 说明
✅ 原生 Java 无依赖,需手动处理编码
⚠️ Guava ❌(谨慎) API 不稳定(@Beta),适合临时用途
✅ Commons IO ✅✅✅ 最佳选择,API 友好且稳定

📌 最佳实践建议:

  • 日常开发优先使用 Commons IO
  • 若项目不允许引入三方库,则使用原生方式 + 显式指定 UTF-8
  • 避免依赖 Guava 的 @Beta API 做核心逻辑

所有示例代码均已上传至 GitHub:https://github.com/baeldung/tutorials/tree/master/core-java-modules/core-java-io-conversions-2


原始标题:Java String to InputStream