1

我有一个自定义格式的二进制文件,而不是使用 DataOutputStream 编写的。文件中数据的简化格式为:IntCharIntCharIntChar...IntChar

我正在使用 DataInputStream 从该文件中读取数据,并使用 available() 来确定下一次读取是否成功。

一切都适用于小文件。但是,对于文件大小大于 Integer.MAX_VALUE 字节的大文件,available() 调用在第一次读取后返回奇怪的负值。我要读取的文件是 4751054632 字节(大约 4.8 gig)。

简化的测试代码:

DataInputStream reader=new DataInputStream(new BufferedInputStream(new FileInputStream("/path/file")));

System.out.println("available at start:\t" + reader.available());

while(reader.available()>0){
    int a=reader.readInt();
    System.out.println("available after readInt:\t" + reader.available());

    char b=reader.readChar();
    System.out.println("available after readChar:\t" + reader.available());

    //do something
}

输出:

available at start: 2147483647 //this is equal to Integer.MAX_VALUE
available after readInt:    -2147475461
available after readChar:   -2147475463

而不是使用 available() 我可以在 try 块中执行 readInt() 和 readChar() 命令并在文件完成时捕获异常,但我试图理解为什么会发生这种行为。本质上,我正在寻找一种方法,如果有数据可供读取,则返回 true,如果文件已完成/流已结束,则返回 false。我认为 available()>0 会做到这一点,但我猜不是?

4

1 回答 1

0

我正在使用 DataInputStream 从该文件中读取数据,并使用 available() 来确定下一次读取是否成功。

那你就错了。请参阅Javadoc:“返回可从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。”。许多实现返回零,不返回零的实现不保证返回正数:当相关数字超过时,它们不能保证Integer.MAX_VALUE.

此外,文件的大小可能会在available()和之间变化read().

您应该通过捕获EOFException抛出它的方法来检测流的结束,或者 -1 或null由不抛出它的方法返回(即read(),所有重载和readLine()分别)。

于 2014-01-15T02:32:25.330 回答