2013-05-04 124 views
1

我有一个自定义格式的二进制文件,比我使用DataOutputStream写入的文件。 文件中的数据的简化形式是:IntCharIntCharIntChar ... IntCharDataInputStream available()行为读取大于Integer.MAX_VALUE字节的文件

我使用DataInputStream类从这个文件读取和可用的(),以确定下一个读是否会成功。

一切工作正常的小文件。但是,对于文件大小大于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 

代替使用可用的()我可以只执行的readInt()和readChar()的命令在try块和捕捉到当文件完成时异常,但我想明白为什么会发生这种行为。本质上,我正在寻找一种方法,如果有数据可读取,将返回true,如果文件已完成/流已结束,则返回false。我认为可用()> 0会做到这一点,但我猜不是吗?

回答

0

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

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

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

你应该抓住上扔,或-1或不(即read(),所有的过载,并分别readLine())方法返回null方法EOFException检测流的末尾。

+0

好吧,这就是我所做的 – drnick 2014-01-26 15:27:24