如果我们的文本文件中有一个字符是unicode,那么它不是2字节的数据吗? 但是read()
方法一次只读取一个字节,作为int
。因此,如果我们有一个FileInputStream
对象fin
并且我们调用int x = fin.read()
一次,如果只有一个字节被读取,我们如何获得全字符System.out.println(x)
? (fin.read()
不在while
循环或任何东西,它只是调用一次)为什么read()一次读取一个字节,如果char是2个字节?
0
A
回答
2
好问题!你是对的,在Java字符总是两个字节,但在其他地方(例如在一个文件的内容)是不正确的。
的文件不被编码“中的‘统一’,因为Unicode是一个规范,而不是编码。编码映射Unicode规范某些字节序列,并且不是所有的这样的编码使用两个字节字符。爪哇char
s为UTF-16它总是两个字节宽,但许多文件存储为UTF-8这是可变宽度; ASCII字符是一个字节,其他是两个或更多
更重要的是,但InputStream
旨在读取二进制数据, 不是字符,二进制数据(实质上)总是一次读取一个字节。如果你想读取文本,你可以将你的流包装成一个Reader
(最好明确指定要使用的编码)将二进制数据转换为文本。在内部,它会调用read()
一次或多次,以便根据编码从字节序列中正确构造一个字符。
2
流是用于读取字节,而不是字符。如果您想阅读字符,请使用Reader
。 Reader将逐个读取一个字符,并将处理字节从字节解码:根据字符编码(和字符本身),可以将字符编码为单个字节,两个或更多字符。
相关问题
- 1. 为什么一个中文字符需要一个字符(2个字节)而不是3个字节?
- 2. 为什么InputStream#read()返回一个int而不是一个字节?
- 3. 一次只读取一个字节而不使用一个字节的HTTP流
- 4. 什么是低半字节,为什么结果是不同的一个数字
- 5. golang Read(p []字节)不读全字节?
- 6. 为什么FileInputReader.read()每次只读取5个字节(Java)?
- 7. 为什么BufferedInputStream每次最多读取2048个字节?
- 8. 从套接字读取一个字节
- 9. 一次读取一个二进制文件1个字节
- 10. 一次读取一个字节的两个文件
- 11. C中2个字节的字节缩短为2个字节?
- 12. 为什么Java char原语占用2个字节的内存?
- 13. 为什么java使用2个字节来存储char值
- 14. 字节 - 2然后下一次+2不起作用...为什么?
- 15. java:FileInputStream.read()读取一个字节,但可以读取一个字符,怎么来的?
- 16. 为什么我只能从okhttp.Response InputStream一次读取2048个字节?
- 17. 说一个方法读取一个字节的数据是什么意思?
- 18. 作为一个无符号字节读单个字节
- 19. 为什么sizeof()返回4个字节而不是2个字节的short int?
- 20. 为什么BitConverter.ToInt32一次只读取一个字节,如果数据未在给定偏移量处对齐?
- 21. 从一个字节获取半字节
- 22. MemoryStream:为什么在读取字节后转换为字节
- 23. 每个字节读取阵列字节
- 24. 在C中一次读取一个文件16字节0
- 25. 使用轮询/选择一次读取一个字节
- 26. 一次读取一个文件16字节问题
- 27. Python http.client.Incomplete Read(0字节读取)错误
- 28. PIC C18:从一个字节读取位
- 29. 从一个字节读取EXIF数据[]
- 30. 读取下一个字节的位数
它每次读取一个字节,因为它一次指定读取一个字节。如果你需要很好地处理字符串,你将不得不使用装饰器。 –
不完全重复,但链接问题的接受答案解释了读取字节和字符之间的区别。 –