读取多字节字符时InputStream和InputStreamReader之间的区别

28 java io character-encoding

之间的区别InputStream,并InputStreamReaderInputStream全文byte,而InputStreamReader作为读取char.例如,如果文件中的文本是abc,那么它们都可以正常工作.但是如果文本是a??由一个a和两个汉字组成的,那么InputStream它就不起作用了.

所以我们应该使用InputStreamReader,但我的问题是:

怎么InputStreamReader识别人物?

a是一个字节,但中文字符是两个字节.它a是作为一个字节读取并将另一个字符识别为两个字节,或者对于本文中的每个字符,是否将其InputStreamReader读取为两个字节?

McD*_*ell 28

一个InputStream读出原始八位组(8位)的数据.在Java中,byte类型等同char于C中的类型.在C中,此类型可用于表示字符数据或二进制数据.在Java中,该char类型与C wchar_t类型具有更大的相似性.

一个InputStreamReader然后将一些编码数据转换为UTF-16.如果"a你们"在磁盘上编码为UTF-8,则它将是字节序列61 E4 BD A0 E4 BB AC.当您使用UTF-8编码传递InputStreamInputStreamReader它时,它将被读作char序列0061 4F60 4EEC.

Java中的字符编码API包含执行此转换的算法.您可以在此处找到Oracle JRE支持的编码列表.在ICU项目是开始,如果你想了解的是如何工作的实践中,内部的好地方.

正如Alexander Pogrebnyak所指出的那样,你应该几乎总是明确地提供编码.byte-to- char未指定编码的方法依赖于JRE默认值,这取决于操作系统和用户设置.


Ale*_*yak 10

您必须通过提供写入二进制文件的字符集给读者提示.例如

Reader reader =
   new InputStreamReader(
       new FileInputStream( "/path/to/file" ),
       "UTF-8" // most likely that the encoding of the file
   )
Run Code Online (Sandbox Code Playgroud)

如果没有提示,它将使用您的平台默认编码,在许多情况下,这不是您想要的.

此链接对编码有一个很好的解释:http://www.joelonsoftware.com/articles/Unicode.html