2017-05-27 111 views
0

我正在寫ObjectOutputStream和ObjectInputStream的func來導入和導出聯繫人信息到文件中。java.io.StreamCorruptedException:無效的流頭:EFBBBFAC

我有一個異常java.io.StreamCorruptedException:無效的流頭:EFBBBFAC部分ObjectInputStream中,我不知道修復它。

如何解決它,謝謝。

LienHe lh = new LienHe(name, phone, img); 
    try { 
     ObjectOutputStream out = new ObjectOutputStream(
           new FileOutputStream("src/Bai6/lienhe.txt", true)); 
     out.writeObject(lh); 
     out.close(); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(FrmThemLienHe.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(FrmThemLienHe.class.getName()).log(Level.SEVERE, null, ex); 
    } 



lst = new ArrayList<>(); 
    try {// exception 
     ObjectInputStream in = new ObjectInputStream(
           new FileInputStream("src/Bai6/lienhe.txt"))); 
     while (in.available() > 0) { 
      LienHe lh = (LienHe) in.readObject(); 
      lst.add(lh); 
     } 
    } catch (ClassNotFoundException | IOException ex) { 
     System.out.println(ex.getMessage()); 
    } 
+2

也許不相關,但'in.available()'不會做你的想法。 – Henry

+0

起初我使用while(true),但發生錯誤,我搜索互聯網,看到人們這樣做。 –

+1

什麼是正確的,你所看到的人做什麼並不一定是同一件事。看到Javadoc。 'available()'不是流結束的有效測試。 – EJP

回答

0

如果不採取特別措施,則不能追加到ObjectOutputStream。您應該序列化集合,並在您這樣做時替換整個文件。

0

你沒有這麼說,但我假設你正在多次運行第一部分代碼(追加到同一個文件中),然後運行第二部分代碼...來閱讀所有的對象中寫道。

實際上,您連接了多個對象流,並試圖將其作爲單個流讀取。

這是行不通的。問題是每個流都以一個特殊的頭文件開始。當您嘗試將連接讀取爲單個流時,閱讀器將看到一個意外的標題。這就是你所看到的例外。

解決方案是重構您的代碼,以便寫入器將所有對象寫入同一個ObjectOutputStream。

+0

這是個問題,謝謝。 –