2013-05-04 75 views
1

我有一個自定義格式的二進制文件,比我使用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會做到這一點,但我猜不是嗎?

回答

0

我正在使用DataInputStream從此文件中讀取數據,並使用available()來確定下一次讀取是否成功。

然後你做錯了。參見Javadoc:「返回一個估計可以從該輸入流不受此輸入流的方法的下一次調用阻擋被讀取(或跳過)的字節數的。」。許多實現返回零,不返回零的不保證返回一個正數:它們不能當有關數字超過時Integer.MAX_VALUE.

此外,文件的大小可能會在available()之間變化和read().

你應該抓住上扔,或-1或不(即read(),所有的過載,並分別readLine())方法返回null方法EOFException檢測流的末尾。

+0

好吧,這就是我所做的 – drnick 2014-01-26 15:27:24