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



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

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

文件不是"以"Unicode"编码的,

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

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

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

相关内容

最新更新