[英]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.