当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将Reader转换为InputStream,将Writer转换为OutputStream?》经验,为你挑选了8个好方法。

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



1> 小智..:

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

new ByteArrayInputStream(inputString.getBytes("UTF-8"))


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

2> Peter..:

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

ReaderInputStream:ReaderInputStream

WriterOutputStream:WriterOutputStream

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


仅供参考: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

3> Peter Ford..:

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

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

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

Apache ReaderInputStream:API/源代码直接链接

Apache WriterOutputStream:API/源代码直接链接

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

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



4> Phil Harvey..:

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

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

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


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

5> Oliv..:

使用:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

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

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



6> Bozho..:

commons-io 2.0有WriterOutputStream



7> Tom Hawtin -..:

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

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

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



8> dfrankow..:

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

ReaderInputStream

WriterOutputStream

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有