我正在阅读Eckel的书,IO章,并且有以下代码(第667页)。
public static void main(String[] args) throws IOException {
try {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("src/io/FormattedMemoryInput.java").getBytes()));
while(true) {
System.out.print((char)in.readByte()); // problem line
}
} catch (EOFException ex) {
System.err.println("End of stream");
}
}
此代码效果很好,但如果我将(char) in.readByte()
更改为in.readChar()
,则会向我打印一些亚洲符号灡捫慧攠楯㬊੩浰潲琠橡癡漮⨻੩浰
。为什么这样以及它为什么不打印英文ASCII符号?
答案 0 :(得分:6)
为什么这样以及为什么它不打印英文ASCII符号?
来自DataInput.readChar()
:
读取两个输入字节并返回一个char值。设a为读取的第一个字节,b为第二个字节。返回的值是:
(char)((a << 8) | (b & 0xff))
此方法适用于读取由DataOutput接口的writeChar方法写入的字节。
换句话说,它将您的文件视为UTF-16编码 - 而且几乎肯定不是。
当您想要阅读文本数据时,您应使用Reader
子类,例如InputStreamReader
缠绕FileInputStream
,指定输入数据的相应编码。