如何从java.lang.String获取java.io.InputStream?

Jar*_*aus 92 java string inputstream

我有一个String我想用作的InputStream.在Java 1.0中,你可以使用java.io.StringBufferInputStream,但是@Deprecrated(有充分的理由 - 你不能指定字符集编码):

此类不能将字符正确转换为字节.从JDK 1.1开始,从字符串创建流的首选方法是通过StringReader 类.

您可以创建一个java.io.Readerwith java.io.StringReader,但没有适配器可以创建Reader和创建InputStream.

我找到了一个古老的虫子,要求一个合适的替代物,但是没有这样的东西存在 - 据我所知.

经常建议的解决方法是java.lang.String.getBytes()用作输入java.io.ByteArrayInputStream:

public InputStream createInputStream(String s, String charset)
    throws java.io.UnsupportedEncodingException {

    return new ByteArrayInputStream(s.getBytes(charset));
}
Run Code Online (Sandbox Code Playgroud)

但这意味着将整个String内存实现为一个字节数组,并且无法实现流的目的.在大多数情况下,这不是什么大问题,但我一直在寻找能够保留流的意图的东西 - 尽可能少的数据在内存中实现(重新).

And*_*rio 78

更新:这个答案正是OP不想要的.请阅读其他答案.

对于那些我们不关心在内存中重新实现数据的情况,请使用:

new ByteArrayInputStream(str.getBytes("UTF-8"))
Run Code Online (Sandbox Code Playgroud)

  • 作为一个因为问题标题而来到这里的访客,我很高兴这个答案就在这里.所以:请不要删除这个答案.顶部的评论"这个答案正是OP不想要的.请阅读其他答案." 足够了. (28认同)
  • 从java7开始:`new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))` (10认同)
  • 该答案提出的解决方案已经被预期,考虑并被该问题拒绝.所以在我看来,应该删除这个答案. (3认同)

Fot*_*los 18

如果您不介意对commons-io包的依赖,那么您可以使用IOUtils.toInputStream(String text)方法.

  • 在这种情况下,你添加一个依赖项,除了`return new ByteArrayInputStream(input.getBytes());'之外什么也不做.这真的值得依赖吗?老实说,不 - 不是. (11认同)
  • 是的,除了正是解决方法之外,op不会使用,因为他不想"将字符串实现到内存中",而选择在系统中其他地方实现的字符串:) (2认同)

bea*_*eat 6

Apache Commons-IO 提供了一个从 Reader 适配到 InputStream 的适配器,名为ReaderInputStream

示例代码:

@Test
public void testReaderInputStream() throws IOException {
    InputStream inputStream = new ReaderInputStream(new StringReader("largeString"), StandardCharsets.UTF_8);
    Assert.assertEquals("largeString", IOUtils.toString(inputStream, StandardCharsets.UTF_8));
}
Run Code Online (Sandbox Code Playgroud)

参考:https : //stackoverflow.com/a/27909221/5658642


Mic*_*ers 2

好吧,一种可能的方法是:

当然,这似乎是一种相当老套的方法,但至少这是一种方法。

  • 您必须小心使用 Piped(Input|Output)Stream。根据文档:“...不建议尝试从单个线程使用两个对象,因为它可能会使线程死锁...”http://java.sun.com/j2se/1.4.2/docs/ api/java/io/PipedInputStream.html (5认同)