我有一个自定义格式的二进制文件,而不是使用 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 会做到这一点,但我猜不是?