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

StackOverflow https://stackoverflow.com/questions/62241

  •  09-06-2019
  •  | 
  •  

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

有帮助吗?

解决方案

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

您只需要选择您选择的编码即可。

其他提示

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

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

嗯,Reader 处理字符,InputStream 处理字节。编码指定了您希望如何将字符表示为字节,因此您不能真正忽略这个问题。对于避免出现问题,我的看法是:选择一个字符集(例如“UTF-8”)并坚持下去。

至于如何实际做到这一点,正如已经指出的那样,“这些类的明显名称是 读取器输入流写入输出流.“令人惊讶的是,”这些不包含在 Java 库中“即使‘相反’的阶级, 输入流读取器输出流写入器 包括。

因此,很多人提出了自己的实现,包括 阿帕奇 公共IO. 。根据许可问题,您可能能够在项目中包含 commons-io 库,甚至复制部分源代码(可下载) 这里).

正如您所看到的,这两个类的文档均指出“JRE 支持的所有字符集编码均已正确处理”。

注意:对此处其他答案之一的评论提到 这个错误. 。但这影响了阿帕奇 蚂蚁 ReaderInputStream 类(这里), 不是 阿帕奇人 公共IO ReaderInputStream 类。

另请注意,如果您从 String 开始,则可以跳过创建 StringReader 并使用 org.apache.commons.io.IOUtils 一步创建一个 InputStream 公共IO 像这样:

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

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

使用:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

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

它用 字符序列输入流 来自 Apache Commons IO 项目。

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

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

有一个 RFE, 但它已关闭,不会修复。

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

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

你是否想写一个的内容 Reader 到一个 OutputStream?如果是这样,您将可以更轻松地包装 OutputStream 在一个 OutputStreamWriter 并写下 char是从 ReaderWriter, ,而不是试图将读者转变为 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

使用 WriterOutputStream 时的警告 - 它并不总是正确/与常规输出流相同地处理将二进制数据写入文件。我遇到了一个问题,花了我一段时间才找到。

如果可以的话,我建议使用输出流作为基础,如果您需要编写字符串,请在流周围使用 OUTputStreamWriter 包装器来完成此操作。将文本转换为字节比相反方式可靠得多,这可能就是 WriterOutputStream 不属于标准 Java 库的一部分的原因

您可以使用 仙人掌 (没有静态方法,只有对象):

你也可以反过来转换:

用于仅使用 java 提供的内容读取流中的字符串。

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top