2013-03-25 131 views
3

假設你有一些AppendObjectOutputStream類(這是一個ObjectOutputStream!)它覆蓋writeStreamHeader()這樣的:追加對象的序列化文件

@Override 
public void writeStreamHeader() throws IOException 
{ 
    reset(); 
} 

現在也是,讓我們說你打算保存多個對象到文件;每次運行程序時都有一個對象。你會,即使在第一次運行,使用AppendObjectOutputStream()?

+1

你不想這樣做。你會遇到微妙的語義錯誤,並且參考共享取決於新的子流開始的位置。 – EJP 2013-03-27 09:14:22

+0

那麼,什麼是建議(和我最終採取的路線)是writeStreamHeader()第一次通過使用一個普通的ObjectOutputStream,然後添加記錄AppendObjectOutputStream定義上面? – 2013-03-28 01:29:57

回答

7

您必須首次使用常規的ObjectOutputStream編寫流頭,否則在使用ObjectInputStream打開文件時會得到java.io.StreamCorruptedException。

public class Test1 implements Serializable { 

    public static void main(String[] args) throws Exception { 
     ObjectOutputStream os1 = new ObjectOutputStream(new FileOutputStream("test")); 
     os1.writeObject(new Test1()); 
     os1.close(); 

     ObjectOutputStream os2 = new ObjectOutputStream(new FileOutputStream("test", true)) { 
      protected void writeStreamHeader() throws IOException { 
       reset(); 
      } 
     }; 

     os2.writeObject(new Test1()); 
     os2.close(); 

     ObjectInputStream is = new ObjectInputStream(new FileInputStream("test")); 
     System.out.println(is.readObject()); 
     System.out.println(is.readObject()); 
+0

這正是我第一次這樣做;首次使用常規ObjectOutputStream寫入文件頭,然後在此程序的所有其他會話中使用AppendObjectOutputStream,但仍然得到StreamCorruptedException! //事實上,我得到這個運行我的程序的第一次:無效的流頭:79737200。我的代碼在調用堆棧中最上面的條目來自records = new ObjectInputStream(new FileInputStream(「record.ser」));聲明 – 2013-03-25 05:24:40

+0

嘗試我的測試,它絕對有效,我懷疑你不關閉輸出流 – 2013-03-25 05:48:28

+0

OutputStream正在關閉;我希望我可以向您發送Java文件,但我正在開發一個數學遊戲,我實際上打算讓人們玩,我不希望人們利用我的代碼浮動。 – 2013-03-25 05:59:41