繁体   English   中英

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

[英]DataInputStream available() behaviour for reading files bigger than Integer.MAX_VALUE bytes

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

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

小型文件一切正常。 但是,对于文件大小大于Integer.MAX_VALUE字节的大文件,available()调用在第一次读取后会返回奇怪的负值。 我试图读取的文件是4751054632字节(约4.8演出)。

简化的测试代码:

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可以做到这一点,但我想不是吗?

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

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

同样,文件的大小可以在available()read().之间改变read().

您应该通过在抛出该EOFException的方法上捕获EOFException来检测流的末尾,或者通过不返回的方法(即分别为read() ,所有重载和readLine() )返回-1或null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM