使用ArrayList将对象附加到文件

时间:2017-04-10 11:16:55

标签: java

我试图学习如何使用数组列表将对象写入文件,但是,当我重新启动程序时,文件会被覆盖并且数据不会被保存:

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");
    }
}

1 个答案:

答案 0 :(得分:2)

不,它没有。

写入后,您的编码缺少关闭 FileOutputStream部分。根据您的上下文,这可能会使事情处于非常不一致的状态。

当然,使用Java7,您只需转到try-with-resources即可自动关闭流!并提示:System.out.println("Cant write data to file")基本上抛弃了确切问题的所有详细信息。您也想打印异常本身!

但除此之外,还有一个概念问题。你的代码在做什么:

  • 填充数组列表对象
  • 打开文件以追加
  • 将对象一个一个地写入该文件

有效;但并不是很好。你看;为了读回这些值 - 您如何知道文件中有多少条目?

我宁愿建议简单地编写完整的列表对象本身。但当然,这需要重新设计整体解决方案 - 例如:

  • 您的方法首先会读取当前存储在文件中的列表
  • 然后将新对象添加到该列表
  • 然后再次将该列表写入文件(但在覆盖模式下,不附加)

长话短说:你应该退后一步,决定你的要求是什么;以及如何以干净的方式到达那里。