格式化的内存输入

时间:2012-06-21 20:38:49

标签: java io

我正在阅读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符号?

1 个答案:

答案 0 :(得分:6)

  

为什么这样以及为什么它不打印英文ASCII符号?

来自DataInput.readChar()

  

读取两个输入字节并返回一个char值。设a为读取的第一个字节,b为第二个字节。返回的值是:   (char)((a << 8) | (b & 0xff))

     

此方法适用于读取由DataOutput接口的writeChar方法写入的字节。

换句话说,它将您的文件视为UTF-16编码 - 而且几乎肯定不是。

当您想要阅读文本数据时,您使用Reader子类,例如InputStreamReader缠绕FileInputStream,指定输入数据的相应编码。