2017-04-10 22 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