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

时间:2016-07-13 06:03:05

标签: java io

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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