2014-02-23 196 views
1

我有需要使用同一類型的多個對象反序列化的文件。反序列化對象列表

public static ArrayList<Dog> readDogs() { 
    ArrayList<Dogs> dogs = null; 
    ObjectInputStream in = null; 

    try { 
     in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(filename))); 
     dogs = new ArrayList<Dog>(); 

     while(true) { 
      dogs.add((Dog) in.readObject()); 
     } 
    } catch (EOFException e) { 

    } catch (Exception e) { 
     System.err.println(e.toString()); 
    } finally { 
     try { 
      in.close(); 
     } catch (IOException e) { 
      System.err.println(e.toString()); 
     } 
    } 
    return dogs; 
} 

當前實現,我依靠一試子句來捕捉和忽略文件例外的結束,這似乎很醜陋,但我不知道怎麼回事,來處理呢?

回答

1

不要序列化/反序列化每隻狗。序列化/反序列化一個列表狗。

所有List實現自身Serializable,和序列化它們會自動序列的所有元素。

+0

好夠了,但有什麼我們可以爲上述方法做?或者問題本身不正確? – sakura

+0

@sakura方法不正確。 OP正在重新發明輪子。只需使用JDK。 – Bohemian

+0

這是我不幸工作的文件的侷限性。 –

0

EOFEception表示由東西你的代碼之外引起的異常條件。如果你沒有捕捉ErrorRuntimeException表示,你可以在你的代碼修復一些bug,然後使用Exception來解決這個問題的最好辦法。

如果問題是不是在你的代碼,這是正確的,但它的外(網絡中斷,未找到文件,文件損壞),它是確定,通常推薦應對使用異常的問題。

有些情況下,您應該在使用它之前驗證數據。如果以不正確格式(例如:用戶輸入)接收數據的可能性很大,則首先驗證它可能更有效。但在極少數情況下,您可能在數千個文件中存在損壞的文件,最好在發生異常時處理它並處理它。

你可以提高你的代碼記錄異常,所以你可以稍後跟蹤它們。你也應該考慮哪些類應該是負責與例外處理(如果它應該抓住它,並解決問題,或者是否應申報throws和它傳播給調用者。

0

使用InputStream.available()測試數據是否可用。流中讀取下一個狗之前

+0

但是,即使這並不能保證告訴你可用流的確切畫面,readObject()可能會失敗,對吧? – sakura

+0

這並不確切。但從我可以告訴,你不需要*確切*。循環直到'InputStream.available()'得到零。由於EOF以外的原因,InputStream.readObject()可能仍然失敗,但這些情況應該使用異常處理明確處理。 – Oswald

0

下面的代碼應該工作:

try { 
     FileInputStream fin = new FileInputStream(filename); 
     in = new ObjectInputStream(new BufferedInputStream(fin)); 
     dogs = new ArrayList<Dog>(); 
     while (fin.available() > 0) { 
      dogs.add((Dog) in.readObject()); 
     } 
    } catch (EOFException e) { 

注意,你應該叫available()FileInputStream對象上,而不是ObjectInputStream對象,這不正確地支持它。還請注意你仍然應該抓住並處理EOFException,因爲它可能在特殊情況下仍然會升起。

+0

將可用結果調用爲零,因此while循環從不執行。 –