2013-05-07 103 views
3

我正在考慮製作一個能幫助我追蹤我的飲食的小項目。我的第一個障礙是建立一個食物類型對象庫並將它們寫入文件。將對象保存到文件中,並在稍後添加更多對象

我遵循這個指南http://beginwithjava.blogspot.no/2011/04/java-file-save-and-file-load-objects.html他們使用

FileOutputStream saveFile=new FileOutputStream("SaveObj.sav"); 
ObjectOutputStream save = new ObjectOutputStream(saveFile); 
save.writeObject(foodType); 

我沒有問題,寫作和閱讀,但是當我要添加更多的對象,我創建了一個新的saveFile的並覆蓋現有的。

我試過Google搜索這個問題,但我找不到任何解決方案將更多的對象添加到已有的文件。

此外,是最好將對象添加到文件,或保存我添加對象的ArrayList<foodObject>

另外,是.sav的最佳文件格式?我可以使用.txt嗎?我也在某處看過.bin。我該如何選擇?

+0

我認爲XML或JSON對你正在做的事很好。 – DeadlyJesus 2013-05-07 12:35:15

+1

你有沒有想過使用數據庫?它們是爲這種東西而製作的 – 2013-05-07 12:41:50

回答

6
FileOutputStream saveFile = new FileOutputStream("SaveObj.sav", true); 

按照documentation

創建一個文件輸出流寫入到由指定的文件對象表示的文件。如果第二個參數爲true,則字節將寫入文件的末尾而不是開頭。

+0

試試看,當你讀回它時,它恐怕會以StreamCorruptedException結尾 – 2013-05-07 12:49:37

0

使用JSON,這是保存Object的最佳方式。

+1

不,它不是。 Java序列化可以是將某些內容轉儲到磁盤的簡單而有效的方式。 JSON增加了一些你需要自己整理的複雜性(例如類型,嵌套對象,類型安全) – Brandon 2013-05-07 12:37:24

+0

'best'DYM crunchier更多的牛軋糖? – 2013-05-07 12:37:43

1

要追加到你已經存了一些對象的文件,你需要這樣的

class AppendingObjectOutputStream extends ObjectOutputStream { 
    public AppendingObjectOutputStream(File file) throws IOException { 
     super(new FileOutputStream(file, true)); 
    } 

    protected void writeStreamHeader() throws IOException { 
     reset(); 
    } 
} 

此類塊被寫入一個ObjectOutputStream頭。

BTW的.sav是不是一種格式,而只是一個無意義的文件名extenstion

+0

爲什麼要創建一個新類,而不是僅僅使用'FileOutputStream(file,true)'? – DeadlyJesus 2013-05-07 12:42:14

+0

由於ObjectOutputStream向文件寫入標題,幻數ACED等,我的版本將其封鎖,否則ObjectInputStream將永遠無法讀取此混亂。其實它很容易測試,雖然我沒有,因爲我知道結果 – 2013-05-07 12:46:21

3

你可以通過真實的FileOutputStream中構造函數中

http://docs.oracle.com/javase/6/docs/api/java/io/FileOutputStream.html#FileOutputStream(java.lang.String,布爾追加到文件末尾)

但是,這提出了一個有趣的問題。在閱讀文件時,你怎麼知道有多少物體被保存?要讀取每個對象,您要調用readObject N次,每次對象一次,但是您需要知道N是什麼,否則您會讀過文件末尾,這並不好。

有兩個解決方案,我能想到的:

  1. 保存對象的數量的計數到第二個文件,您可以通過閱讀該文件,解析爲int覆蓋每次加1,寫回。當然存在文件可能不同步然後發生不好的事情的風險。
  2. 保存對象的集合(如ArrayList或HashSet)並每次覆蓋該文件。這增加了一些額外的開銷,但在事物的宏偉計劃中,可能很少,不值得擔心。

而且,它是最好的對象添加到文件,或保存一個 ArrayList中,我的對象添加到?

像軟件中的所有東西一樣,這取決於。我給了你上面的一些優點和缺點,以幫助你做出決定,但你的milage可能會有所不同。就個人而言,我會使用ArrayList並將其序列化,但我沒有完整的需求圖片,所以我不會說它是「最好的」。

此外,.sav是最佳文件格式?我可以使用.txt嗎?我也在某處看過.bin。我該如何選擇?

這裏沒有文件格式。格式是Java對象序列化中的原始字節。要讀取文件,您需要一個具有相同類的Java程序來反序列化數據結構。如果你只是指什麼是最好的文件擴展名,我不知道。沒關係。 .txt可能會誤導人們認爲這是一個文本文件,因此我建議不要將它保存爲.txt。

.bin是可以接受的,因爲格式實際上是二進制的。因爲它更清晰,所以我建議.bin覆蓋.sav。除了數據保存在那裏以外,保存不會告訴我任何其他的東西。它不會比.data好

相關問題