将对象保存到文件,并在以后添加更多对象

时间:2013-05-07 12:31:54

标签: java serialization

我正在考虑制作一个可以帮助我跟踪饮食的小项目。我的第一个障碍是构建一个食物类型对象库并将它们写入文件。

我按照本指南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。我该如何选择?

4 个答案:

答案 0 :(得分:6)

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

根据documentation

  

创建文件输出流以写入由指定的File对象表示的文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头。

答案 1 :(得分:3)

您可以通过将true传递给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)并每次覆盖该文件。这增加了一些开销,但在宏观方案中,可能很少,不值得担心。
  3.   

    此外,最好将对象添加到文件中,还是保存   我将对象添加到?

    的ArrayList
    像软件中的所有东西一样,它取决于。我给了你一些优点和缺点,以帮助你决定,但你的milage可能会有所不同。就个人而言,我会使用一个ArrayList并将其序列化,但我没有完整的需求图片,所以我不会说它是“最好的”。

      

    另外,.sav是最好的文件格式吗?我可以使用.txt吗?我也见过.bin。我该如何选择?

    此处没有文件格式。格式是Java对象序列化的原始字节。要读取文件,您需要具有相同类的Java程序才能反序列化数据结构。如果你只是意味着哪个是最好的文件扩展名,我不知道。没关系。 .txt可能误导人们认为它是文本文件,但显然不是,所以我建议不要将它保存为.txt。

    可以接受

    .bin,因为格式实际上是二进制的。我推荐.bin超过.sav,因为它更清晰。 .save不会告诉我除了保存数据以外的任何内容。它并不比.data

答案 2 :(得分: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不是一种格式,而只是一种无意义的文件名扩展

答案 3 :(得分:0)

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