如果-1是标准EOF字节,为什么DataInputStream会这样做?

时间:2014-08-01 10:57:25

标签: java stream eof datainputstream

readInt()中的java.io.DataInputStream函数如下:

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));
}

在函数中,您可以看到它在EOFException时抛出(ch1|ch2|ch3|ch4)<0(文件结束异常)。但我受到标准EOF字节为-1的影响。 (即,255,0xFF,0b11111111或您喜欢的任何表示法......)但是,此函数仅检查是否有任何字节为负数。那么......这里发生了什么?

1 个答案:

答案 0 :(得分:2)

EOF是-1(int),int是32位。因此255(字节)不等于-1(int)。

那么readInt()方法在做什么?

int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();

这些行以原始字节读取,如int。为原始字节保留了8位的int。由于字节中没有空间来表示NO VALUE,因此使用int范围中的额外位。负面的一点。

因此,这些行乐观地读取所有四个字节,它们将组合在一起以创建最终的int值。不应将此目标int值与每个字节的int表示混淆。

 if ((ch1 | ch2 | ch3 | ch4) < 0)

是检查已读取的所有四个字节的有效方法。另一种方法是读取一个字节,检查,然后读取下一个并测试。有一个分支比现有CPU有四个分支更有效。

return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));

if检查失败后,我们知道一个字节的每个int表示都是正的,因此int中24个额外的位(字节值(32-8位)未使用的全部为零)。因此,我们将位移到正确的位置并将它们组合起来;给我们最终的价值。