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

时间:2020-03-05 18:53:16  来源:igfitidea点击:

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

解决方案

回答

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

我不确定是否会解决所有噩梦般的文本编码问题。

有一个RFE,但已关闭,无法解决。

回答

我们真的无法避免处理文本编码问题,但是有一些现有的解决方案:

  • 从Reader到InputStream:ReaderInputStream。
  • WriterOutputStreamWriterOutputStream

我们只需要选择所需的编码即可。

回答

我们是否正在尝试将Reader的内容写入OutputStream中?如果是这样,我们将有一个更轻松的时间将OutputStream包裹在OutputStreamWriter中,并将chars从Reader写入Writer,而不是尝试将阅读器转换为InputStream。 :

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

回答

还要注意,如果我们以String开头,则可以使用Commons IO中的org.apache.commons.io.IOUtils跳过创建StringReader并一步一步创建InputStream,如下所示:

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

当然,我们仍然需要考虑文本编码,但是至少转换是一步完成的。

回答

如果从字符串开始,还可以执行以下操作:

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

回答

commons-io 2.0具有WriterOutputStream