当前位置: 首页 > 面试题库 >

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

章哲彦
2023-03-14
问题内容

InputStream和之间的区别InputStreamReaderInputStream读为byte,而InputStreamReader读为char。例如,如果文件中的文本为abc,则它们都可以正常工作。但是,如果文本是a你们,由,a和两个汉字组成,则InputStream不能正常工作。

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

如何InputStreamReader识别字符?

a是一个字节,但是汉字是两个字节。是将其读取a为一个字节,将其他字符识别为两个字节,还是对于本文中的每个字符,将其InputStreamReader读取为两个字节?


问题答案:

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

InputStreamReader然后,An 会将数据从某种编码转换为UTF-16。如果“ a你们”在磁盘上被编码为UTF-8,它将是字节序列61E4 BD A0 E4 BBAC。当您使用UTF-8编码将传递InputStreamInputStreamReader时,它将作为char序列读取0061 4F604EEC

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

正如Alexander Pogrebnyak指出的那样,您几乎应该始终明确提供编码。未指定编码的byte-to- char方法依赖于JREdefault,后者取决于操作系统和用户设置。



 类似资料:
  • 我试图从一个读取。我写了下面的代码 我不明白的是我应该在一次迭代中读取多少字节?流包含保存在磁盘上的文件。 我在这里读过,但我并不真正理解这篇文章。

  • 问题内容: 这些声明之间有何不同? 每种情况下的内存分配如何? 问题答案: 要更正编译错误,请使用以下语句之一替换 下一节将以上陈述相互比较 字符串常量 “ MY PROFESSION”是一个常量,并存储在String池中 是不可变的,即完整的内容无法修改。 字符串的大小/长度是固定的(无法附加) 字符数组 保存String的基础数组的副本(通过)并存储在堆空间中 通过加载单个字符常量在堆栈框架中

  • 本文向大家介绍字符数组和字符串之间的区别,包括了字符数组和字符串之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解字符数组和字符串之间的区别。 字符串 他们是不可变的。 一旦它们被定义,就不能被更改。 它指的是一个字符序列,表示为单个数据类型。 它包含了substring()、charAt()等内置函数。 可以使用' + '操作符将字符串追加到一起,从而形成一个新的字符串。

  • 问题内容: 空字符串()和空字符串()有什么区别? 这就是我所拥有的: 这是什么意思? 问题答案: 表示将空值分配给。在这种情况下,与相同,将按预期产生。 表示将()或“完全没有值”分配给。因此,这与相同,它将产生一个,因为您无法在Java中对变量(指针或类似物)调用方法。 还有一点,声明 实际上具有与以下功能相同的效果: 鉴于 如前所述,是另一回事。

  • 问题内容: 字符串文字和字符串对象的添加有什么区别? 例如 为什么/ 不指向与相同的位置? 问题答案: 因为不是 常量表达式 ,由于和不是,因此其结果不会被插入,即创建另一个对象来表示它,因此引用比较产生。 JLS 3.10.5字符串文字 : 使用String.intern方法,对字符串常量(或更常见的是常量表达式的值(第15.28节)的字符串)进行“ interned”,以便共享唯一的实例。 J

  • 问题内容: 之间有什么区别 和 问题答案: 当你使用字符串文字时,可以将字符串嵌入,但是当你使用时,你将获得一个新的字符串对象。 在此示例中,两个字符串文字均引用相同的对象: 在这里,创建了2个不同的对象,它们具有不同的引用: 通常,应尽可能使用字符串文字表示法。它更易于阅读,并且为编译器提供了优化代码的机会。