如何将Reader转换为InputStream,将Writer转换为OutputStream?

And*_*avu 87 java stream

是否有一种简单的方法可以避免处理文本编码问题?

小智 93

如果您从String开始,您还可以执行以下操作:

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

  • 好的'ReaderInputStream`实现需要更少的内存 - 不需要一次将所有字节存储在一个数组中. (6认同)
  • 我喜欢这个解决方案因为它需要单元测试接受输入(例如)标准输入的代码. (3认同)
  • 这解决了字符串的问题,但不解决原始问题 (2认同)

Pet*_*ter 44

您无法真正避免处理文本编码问题,但现有解决方案:

您只需要选择您选择的编码.

  • 仅供参考:ReaderInputStream代码在读取字节的方式上有一个错误(它不适用于所有编码).证明:http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_stringclass有一个开放的bug:https://issues.apache.org/bugzilla/show_bug的CGI?ID = 40455 (7认同)

Pet*_*ord 41

好吧,Reader处理字符,InputStream处理字节.编码指定了您希望如何将字符表示为字节,因此您无法真正忽略该问题.至于避免问题,我的意见是:选择一个字符集(例如"UTF-8")并坚持下去.

关于如何实际执行它,正如已经指出的那样," 这些类的明显名称是ReaderInputStreamWriterOutputStream. "令人惊讶的是," 这些不包含在Java库中 ",即使"相反的"类,InputStreamReaderOutputStreamWriter 包括在内.

因此,很多人都提出了自己的实现,包括Apache Commons IO.根据许可问题,您可能可以在项目中包含commons-io库,甚至可以复制部分源代码(可在此处下载).

正如您所看到的,这两个类的文档都指出"JRE支持的所有字符集编码都得到了正确处理".

注意这里对其中一个答案的评论提到了这个错误.但这会影响Apache Ant ReaderInputStream类(此处),而不影响 Apache Commons IO ReaderInputStream类.


Phi*_*vey 19

另请注意,如果您从一个String开始,您可以跳过创建一个StringReader,并使用Commons IO中的 org.apache.commons.io.IOUtils一步创建一个InputStream,如下所示:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

当然,您仍然需要考虑文本编码,但至少转换只需一步即可完成.

  • 这个方法基本上是`new ByteArrayInputStream(report.toString().getBytes("utf-8"))`,它涉及在内存中分配两个额外的报告副本.如果报告很大,则很糟糕.看我的回答. (3认同)

Oli*_*liv 8

使用:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

这种方式不需要预先转换到String然后byte[]分配更多堆内存,以防报告很大.它会在从StringBuffer直接读取流时立即转换为字节.

它使用来自Apache Commons IO项目的CharSequenceInputStream.


Tom*_*ine 5

这些类的明显名称是ReaderInputStream和WriterOutputStream.不幸的是,这些不包含在Java库中.但是,谷歌是你的朋友.

我不确定是否会解决所有文本编码问题,这些问题都是噩梦般的.

有一个RFE,但它是关闭的,不会修复.


dfr*_*kow 5

你无法避免文本编码问题,但Apache commons-io

请注意,这些是Peter对koders.com的回答中提到的库,只是指向库而不是源代码的链接.