如果 char 是 2 个字节,为什么 read() 一次读取一个字节?

Ser*_*esh 1 java io

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

dim*_*414 5

好问题!您是对的,在 Java 中字符总是两个字节,但在其他地方(例如在文件的内容中)并非如此。

文件不是“以“Unicode”编码的,因为Unicode是一种规范,而不是一种编码。编码将 Unicode 规范映射到某些字节序列,并非所有此类编码都使用两字节字符。JavacharUTF-16,它始终是两个字节宽,但许多文件存储为可变宽度的UTF-8;ASCII 字符是一个字节,其他的则是两个或更多。

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