格式化的内存输入

4le*_*x1v 2 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码效果很好,但是如果我(char) in.readByte()改为in.readChar()它就会打印出一些亚洲符号?????????????????.为什么这样,为什么它不打印英文ASCII符号?

Jon*_*eet 6

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

来自DataInput.readChar():

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

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

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

当你想要读取文本数据时,你应该使用一个Reader子类,例如InputStreamReader包裹FileInputStream,指定输入数据的适当编码.