如果我们的文本文件中有一个unicode字符,那么它不能是2个字节的数据吗?
但read()
方法一次读取一个字节为int
。因此,如果我们有一个FileInputStream
对象fin
并且我们调用int x = fin.read()
一次,如果只读取了一个字节,我们如何在System.out.println(x)
上获取完整字符? (fin.read()
不在while
循环或任何内容中,只需调用一次)
答案 0 :(得分:4)
好问题!你是对的, in Java 字符总是两个字节,但在其他地方并不是真的(例如在文件的内容中)。
文件未编码"在" Unicode"因为Unicode是规范,而不是编码。编码将Unicode规范映射到某些字节序列,并非所有此类编码都使用双字节字符。 Java char
是UTF-16,它总是两个字节宽,但许多文件存储为UTF-8,它是可变宽度的; ASCII字符是一个字节,其他是两个或更多。
更重要的是,InputStream
旨在读取二进制数据,不是字符,而二进制数据(基本上)总是一次读取一个字节。如果要读取文本,请将流包装在Reader
中(最好明确指定要使用的编码),以将二进制数据转换为文本。在内部,它将调用read()
一次或多次,以便根据编码从字节序列中正确构造字符。
答案 1 :(得分:3)
Streams用于读取字节,而不是字符。如果您想阅读字符,请使用Reader
。 Reader将一次读取一个字符,并处理从字节解码的字符:根据字符编码(和字符本身),字符可以用单个字节编码,两个甚至更多。