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 并覆盖现有的。

我试过用谷歌搜索这件事,但我找不到任何解决方案来将更多对象添加到已经存在的文件中。

另外,最好将对象添加到文件中,还是保存ArrayList<foodObject>我将对象添加到的文件?

另外,.sav 是最好的文件格式吗?我可以使用 .txt 吗?我也在某个地方看到过 .bin 。我该如何选择?

4

4 回答 4

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

根据文档

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

于 2013-05-07T12:35:11.370 回答
3

您可以通过将 true 传递给 FileOutputStream 构造函数来追加到文件的末尾,如下所示

http://docs.oracle.com/javase/6/docs/api/java/io/FileOutputStream.html#FileOutputStream(java.lang.String , boolean)

然而,这提出了一个有趣的问题。读取文件时,如何知道保存了多少对象?要读入每个对象,您想调用 readObject N 次,每个对象调用一次,但您需要知道 N 是多少,否则您会读到文件末尾,这是不好的。

我能想到的解决方案有两种:

  1. 将对象数量的计数保存到第二个文件中,您每次通过读取文件、解析为 int、加 1、写回来覆盖该文件。当然,文件可能会不同步,然后发生坏事。
  2. 保存对象的集合(如 ArrayList 或 HashSet)并每次覆盖文件。这增加了一些额外的开销,但在宏伟的计划中,可能很少,不值得担心。

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

就像软件中的所有东西一样,这取决于。我在上面给了你一些利弊来帮助你做出决定,但你的里程可能会有所不同。就个人而言,我会使用 ArrayList 并对其进行序列化,但我没有完整了解您的需求,所以我不会说它是“最好的”。

另外,.sav 是最好的文件格式吗?我可以使用 .txt 吗?我也在某个地方看到过 .bin 。我该如何选择?

这里没有文件格式。格式是来自 Java 对象序列化的原始字节。要读取该文件,您需要一个具有相同类的 Java 程序来反序列化数据结构。如果您只是说哪个是最好的文件扩展名,我不知道。没关系。.txt 可能会误导人们认为它显然不是文本文件,因此我建议不要将其保存为 .txt。

.bin 是可以接受的,因为格式实际上是二进制的。我推荐 .bin 而不是 .sav,因为它更清晰。.save 没有告诉我除了数据保存在那里之外的任何内容。它并不比 .data 好

于 2013-05-07T12:48:48.960 回答
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 不是一种格式,而只是一个无意义的文件扩展名

于 2013-05-07T12:40:02.497 回答
0

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

于 2013-05-07T12:36:15.503 回答