簡體   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