有没有一种简单的方法,以避免处理文本编码的问题?
Answer 1:
你真的无法避免处理文本编码的问题,但也有现有的解决方案:
-
Reader
到InputStream
:ReaderInputStream
-
Writer
到OutputStream
:WriterOutputStream
你只需要选择您所选择的编码。
Answer 2:
如果你是一个字符串出发,你也可以做到以下几点:
new ByteArrayInputStream(inputString.getBytes("UTF-8"))
Answer 3:
好了,读者与人物,并与字节的InputStream交易的交易。 该编码指定您希望如何表现你的角色为字节,所以你不能真正忽视的问题。 至于避免的问题,我的看法是:选择一个字符集(如“UTF-8”),并坚持下去。
至于如何真正做到这一点,因为已经指出,“ 这些类的明显名称ReaderInputStream和WriterOutputStream。”出人意料的是,“ 这些都是不包含在Java库 ”即使“”相反班, InputStreamReader的和OutputStreamWriter 是包括在内。
所以,很多人都拿出了自己的实现,包括Apache 下议院IO 。 根据许可证的问题,你可能会能够包括公地IO库在你的项目中,甚至复制源代码的一部分(这是下载这里 )。
- 阿帕奇ReaderInputStream: API / 源代码直接链接
- 阿帕奇WriterOutputStream: API / 源代码直接链接
正如你所看到的,这两个类文件规定,‘由JRE支持的所有字符集编码正确处理’。
NB在其他的答案中的一个注释这里提到了这个bug 。 但是,这会影响Apache Ant的 ReaderInputStream类( 在这里 ), 而不是 Apache 下议院IO ReaderInputStream类。
Answer 4:
还要注意的是,如果你开始了与一个字符串,你可以跳过创建一个StringReader并使用org.apache.commons.io.IOUtils从一个步骤创建一个InputStream 下议院IO像这样:
InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
当然,你还需要考虑文本编码,但至少在转换在一个步骤发生。
Answer 5:
使用:
new CharSequenceInputStream(html, StandardCharsets.UTF_8);
这种方式不需要前期转换为String
,然后byte[]
其中分配更多的堆内存,以防报表较大。 它把在飞行到字节流中读取,直接从StringBuffer的。
它采用CharSequenceInputStream从Apache的百科全书IO项目。
Answer 6:
公地-io的2.0具有WriterOutputStream
Answer 7:
这些类的名字显然是ReaderInputStream和WriterOutputStream。 不幸的是,这些不包含在Java库。 然而,谷歌是你的朋友。
我不知道它是会得到周围的所有文字编码的问题,这是噩梦般的。
有一个RFE,但它是封闭的,不会解决。
Answer 8:
你无法避免文字编码的问题,但Apache的公共-io的有
- ReaderInputStream
- WriterOutputStream
注意,这些都是koders.com彼得的答复中提到的库,只链接库,而不是源代码。
Answer 9:
你们是不是要一个的内容写入Reader
到OutputStream
? 如果是这样,你就可以更轻松地包裹OutputStream
在OutputStreamWriter
和写入char
从S 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
Answer 10:
使用警告时WriterOutputStream - 它并不总是处理二进制数据写入到文件中正确/一样有规律的输出流。 我有这一点,我花了一段时间来追查的问题。
如果可以的话,我建议你使用的输出流作为你的基地,如果你需要写的字符串,使用OUtputStreamWriter包装流周围做到这一点。 这是更可靠的文本转换为比周围的其他方式,这可能是为什么字节是WriterOutputStream不是标准Java库的一部分
Answer 11:
您可以使用Cactoos (没有静态方法,仅对象):
-
new InputStreamOf(reader)
-
new OutputStreamTo(writer)
您可以其他方式转换前后过:
-
new ReaderOf(inputStream)
-
new WriterTo(outputStream)
Answer 12:
对于使用正是在java用品的流读出一个字符串。
InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));