我有一个自定义格式的二进制文件,比我使用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会做到这一点,但我猜不是吗?
好吧,这就是我所做的 – drnick 2014-01-26 15:27:24