DataInputStream available()用于读取大于Integer.MAX_VALUE字节的文件的行为

时间:2013-05-04 17:12:12

标签: java filesize datainputstream

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

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

一切都适用于小文件。但是,对于大文件,如果filesize大于Integer.MAX_VALUE字节,则可用()调用在第一次读取后返回奇怪的负值。我试图读取的文件是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

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

1 个答案:

答案 0 :(得分:0)

  

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

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

此外,文件的大小可能会在available()read().

之间变化

你应该通过捕获引发它的方法的EOFException来检测流的结束,或者通过不返回的方法返回-1或null(即read(),所有重载,分别是readLine()