如果我们的文本文件中有一个 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
。阅读器将一次读取一个字符,并将处理从字节解码的字符:根据字符编码(和字符本身),字符可以编码为单个字节,两个甚至更多。