InputStream
的区别和 InputStreamReader
是InputStream
读作 byte
, 而 InputStreamReader
读作 char
.例如,如果文件中的文本是 abc
,然后他们都工作正常。但是如果文本是 a你们
,由 a
组成和两个汉字,然后是InputStream
不工作。
所以我们应该使用 InputStreamReader
,但我的问题是:
InputStreamReader
怎么样?识别字符?
a
是一个字节,但是一个汉字是两个字节。是否阅读 a
作为一个字节并将另一个字符识别为两个字节,或者对于此文本中的每个字符,InputStreamReader
把它读成两个字节?
最佳答案
InputStream
读取原始八位字节(8 位)数据。在Java 中,byte
类型等价于C 中的char
类型。在C 中,该类型可用于表示字符数据或二进制数据。在 Java 中,char
类型与 C wchar_t
类型有更大的相似之处。
InputStreamReader
然后会将数据从某种编码转换为 UTF-16。如果“a你们”在磁盘上编码为UTF-8,则为61 E4 BD A0 E4 BB AC
的字节序列。当您将 InputStream
以 UTF-8 编码传递给 InputStreamReader
时,它将被读取为字符序列 0061 4F60 4EEC
。
Java 中的字符编码 API 包含执行此转换的算法。您可以找到 Oracle JRE here 支持的编码列表。 . ICU project如果您想了解其在实践中的工作原理,这是一个很好的起点。
作为 Alexander Pogrebnyak points out ,您应该几乎总是明确地提供编码。未指定编码的 byte
-to-char
方法依赖于 JRE default ,这取决于操作系统和用户设置。
关于java - InputStream和InputStreamReader在读取多字节字符时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764065/