2014-02-09 73 views
1

我一直在試圖弄清楚爲什麼從文件中讀取對象的方法沒有奏效,並意識到available()方法的ObjectInputStream給出了0,即使該文件沒有被完全讀取。 在我使用FileInputStream available()方法來確定EOF並且它工作之後,該方法確實起作用了!ObjectInputStream available()方法不能按預期方式工作(Java)

爲什麼ObjectInputStram方法不能在FileInputStream中工作?

下面的代碼:

public static void getArrFromFile() throws IOException, ClassNotFoundException { 
    Product p; 
    FileInputStream in= new FileInputStream(fName); 
    ObjectInputStream input= new ObjectInputStream(in); 
    while(in.available()>0){ 
     p=(Product)input.readObject(); 
     if (p.getPrice()>3000) 
      System.out.println(p); 
    } 
    input.close(); 

P.S- 我讀過,我應該使用EOF異常,而不是可用的()這一點,但我只是想知道爲什麼這是行不通的。

非常感謝!

回答

1

available()方法只是告訴可以讀取多少個字節而沒有阻塞。它在常規代碼中不是很有用,但人們看到名字並錯誤地認爲它做了其他事情。

所以簡而言之:不要使用available(),它不是正確的使用方法。流表示以不同的方式結束,例如返回-1或在ObjectInputStream的情況下,拋出EOFException

3

因爲,正如javadoc所示,available()返回可以讀取的字節數的估計值而不會阻止。基本的InputStream實現始終返回0,因爲這是一個有效的估計。但無論它返回什麼,它返回0的事實並不意味着沒有什麼可讀的了。只有流不能保證至少有一個字節可以被讀取而沒有阻塞。

+0

感謝您的回答,但仍然沒有看到區別。爲什麼ObjectInputStram方法不適用於FileInputStream? – Mapisto

+0

由於某些原因,ObjectInputStream無法保證(或選擇不提供這樣的保證)可以在不阻塞的情況下讀取某些字節,而FileInputStream可以。你將不得不深入這兩個類的代碼來精確地理解他們的可用類()。但這是非常無用的,因爲available()幾乎沒有用處,當然也不是這種情況。 –

1

雖然這沒有清楚記錄,但我已經從經驗中認識到它與動態數據有關。如果您的課程僅包含靜態類型的數據,則available()可以估算其大小。如果對象中有動態數據,比如列表等,那麼就不可能做出這個估計。

+0

歡迎來到StackOverflow!請根據問題提供意見,而不是直接回答。 – Rafael

相關問題