2017-04-10 43 views
0

我試圖學習如何使用Array List將對象寫入文件,但是,當我重新啓動程序時,文件不斷被覆蓋並且數據未保留:使用ArrayList將對象附加到文件

System.out.println("Enter DVD title: "); 
String title = inputScanner.nextLine(); 
System.out.println("Enter main actor: "); 
String actor = inputScanner.nextLine(); 
System.out.println("Enter DVD's release year: "); 
String yearOfRelease = inputScanner.nextLine(); 
newDVD = new DVD(title, actor, yearOfRelease); 
System.out.println("Entered DVD details: "); 
DVDCollection.add(newDVD); 
writeDVDs(DVDCollection); 
break; 

上面的代碼從用戶處獲取輸入並將其存儲在ArrayList中。

當我重新啓動程序似乎擦拭一切。

static void writeDVDs(ArrayList<DVD> DVDs) throws Exception { 
    try { 
     Boolean append = true; 
     FileOutputStream fileOutputStream = new FileOutputStream("DVDCollection.dat", append); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 
     for (int i = 0; i < DVDs.size(); i++){ 
      DVD theDVD = DVDs.get(i); 
      objectOutputStream.writeObject(theDVD); 
      System.out.println("DVD successfully saved"); 
     } 
    } 
    catch (Exception e){ 
     System.out.println("Cant write data to file"); 
    } 
} 
+0

我再次更新了我的答案;有些反饋會受到歡迎... – GhostCat

+0

只需編寫整個列表。你不需要迭代它。但是,如果不採取特殊措施,您無法附加到對象流。 – EJP

+0

感謝您的反饋,我沒有聲稱擅長編程,但這是def幫助 –

回答

2

不,它沒有。

您的編碼缺少部分關閉FileOutputStream後寫入它。根據您的情況,這可能會使事情處於非常不一致的狀態。

當然,對於Java7,您應該簡單地轉向try-with-resources以使您的流自動關閉!並提示:System.out.println("Cant write data to file")基本扔掉了所有的詳細資料的確切問題。你也想自己打印異常!

但除此之外,還有一個概念的問題。你的代碼是這樣做的:

  • 一個

該工程填補一個數組列表對象

  • 打開一個文件用於追加
  • 寫對象到該文件......一個;但並不完美。你看;爲了讀取這些值 - 你怎麼知道你的文件中有多少條目?

    我寧願建議只需寫完整列表對象本身。但當然,這將需要返工的整體解決方案 - 比如像:

    • 你的方法第一讀取當前存儲在文件列表中的
    • 那麼你添加新的對象添加到列表
    • 然後你再編寫一個列表文件(但在覆蓋模式下,不追加)

    長話短說:你應該退後一步,讓你的心究竟你的要求;以及如何以乾淨的方式到達那裏。

  • +0

    他甚至不寫一個列表,他寫的單一的DVD ... – slowy

    +0

    對不起,這是我的第一篇文章,項目的原因是允許用戶創建他們的DVD列表,存儲所述列表並編輯列表。附:即時學生剛剛開始編程,我有不到6個月的經驗 –

    +0

    這不是問題。但是,當新手提出問題時,通常問題會回來。因此,在這裏提出一個問題並離開幾個小時是不太好的。 – GhostCat