2011-10-20 24 views
1

我想將多個對象寫入文件,但問題是我沒有立即寫入所有對象。我必須編寫一個對象,然後關閉該文件,然後在某個時間之後,我想將另一個對象添加到同一個文件中。如何將多個對象寫入文件?

我目前正在做它作爲 FileOutputStream("filename", true) ,以便它將追加對象到文件的結尾,而不是覆蓋它。但是,我得到這個錯誤:

java.io.StreamCorruptedException:無效類型代碼:AC

任何想法如何,我可以解決這個問題?

謝謝,

+0

如果你不需要隨機訪問這些對象,@ Jon的答案就是標記。但是,如果你這樣做(即不想讀取所有這些文件),你需要在文件的開頭(或結尾)提供一些目錄,包括偏移量,一些關鍵字和長度。或者只是使用單獨的文件,現在文件系統(esp ext4)在組織很小的文件時效率很高(尤其是如果你有SSD:D) – bestsss

+0

謝謝大家,Jon提出的解決方案看起來很健壯,但對我來說太複雜了,所以我想我會解決您的解決方案(爲每個新對象創建單獨的文件)或EJP的解讀舊對象的方法,然後將所有舊+新對象寫入文件增益。 – comatose

回答

2

您不能追加不同的ObjectOutputStreams到同一個文件。您將不得不使用不同形式的序列化,或者讀入文件並將所有對象和新對象寫出到新文件中。

2

您需要serialize/deserializeList<T>。看看this stackoverflow線程。

3

一種選擇是將文件分割成單獨的消息。當你想寫郵件時,首先將它序列化爲ByteArrayOutputStream。然後打開文件以附加DataOutputStream - 用writeInt寫入長度,然後寫入數據。

當你從流中讀取,你會用DataInputStream打開它,然後反覆調用readInt找到下一個消息的長度,然後readFully閱讀的消息本身。將消息放入ByteArrayInputStream,然後反序列化。

或者,使用比內置Java序列化更好的序列化格式 - 我是Protocol Buffers的粉絲,但有很多可用的替代方案。內置的序列化對我來說太脆弱了。