Кодировка или IO тонкости

Рейтинг: 1Ответов: 1Опубликовано: 02.12.2014

Есть такой код, который считывает файл

InputStream is = new FileInputStream("/home/roman/sudo");
BufferedInputStream bis = new BufferedInputStream(is);
DataInput dis = new DataInputStream(bis);

Потом чтоб преобразовать его в правильный примитив я хочу воспользоваться DataInput интерфейсом, но я не понимаю почему результаты разные

System.out.println((char)dis.readByte());

вывод: h

System.out.println(dis.readChar());

вывод: 瑴

System.out.println((char)dis.readInt());

вывод: ⼯

содержимое файла такое : http://dl.goo

Ответы

▲ 2Принят

Смотрим исходный код методов:

public final byte readByte() throws IOException {
    int ch = in.read();
    if (ch < 0)
        throw new EOFException();
    return (byte)(ch);
}

public final char readChar() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    if ((ch1 | ch2) < 0)
        throw new EOFException();
    return (char)((ch1 << 8) + (ch2 << 0));
}

public final int readInt() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    int ch3 = in.read();
    int ch4 = in.read();
    if ((ch1 | ch2 | ch3 | ch4) < 0)
        throw new EOFException();
    return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}

byte 1 байт, char 2 байта, int 4 байта. Естесственно будут разные результаты.