2016-07-13 82 views
0

如果我们的文本文件中有一个字符是unicode,那么它不是2字节的数据吗? 但是read()方法一次只读取一个字节,作为int。因此,如果我们有一个FileInputStream对象fin并且我们调用int x = fin.read()一次,如果只有一个字节被读取,我们如何获得全字符System.out.println(x)? (fin.read()不在while循环或任何东西,它只是调用一次)为什么read()一次读取一个字节,如果char是2个字节?

+1

它每次读取一个字节,因为它一次指定读取一个字节。如果你需要很好地处理字符串,你将不得不使用装饰器。 –

+0

不完全重复,但链接问题的接受答案解释了读取字节和字符之间的区别。 –

回答

2

好问题!你是对的,在Java字符总是两个字节,但在其他地方(例如在一个文件的内容)是不正确的。

的文件不被编码“中的‘统一’,因为Unicode是一个规范,而不是编码。编码映射Unicode规范某些字节序列,并且不是所有的这样的编码使用两个字节字符。爪哇char s为UTF-16它总是两个字节宽,但许多文件存储为UTF-8这是可变宽度; ASCII字符是一个字节,其他是两个或更多

更重要的是,但InputStream旨在读取二进制数据, 不是字符,二进制数据(实质上)总是一次读取一个字节。如果你想读取文本,你可以将你的流包装成一个Reader(最好明确指定要使用的编码)将二进制数据转换为文本。在内部,它会调用read()一次或多次,以便根据编码从字节序列中正确构造一个字符。

2

流是用于读取字节,而不是字符。如果您想阅读字符,请使用Reader。 Reader将逐个读取一个字符,并将处理字节从字节解码:根据字符编码(和字符本身),可以将字符编码为单个字节,两个或更多字符。

相关问题