2013-05-07 43 views
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的并覆盖现有的。

我试过Google搜索这个问题,但我找不到任何解决方案将更多的对象添加到已有的文件。

此外,是最好将对象添加到文件,或保存我添加对象的ArrayList<foodObject>

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

+0

我认为XML或JSON对你正在做的事很好。 – DeadlyJesus 2013-05-07 12:35:15

+1

你有没有想过使用数据库?它们是为这种东西而制作的 – 2013-05-07 12:41:50

回答

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

按照documentation

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

+0

试试看,当你读回它时,它恐怕会以StreamCorruptedException结尾 – 2013-05-07 12:49:37

0

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

+1

不,它不是。 Java序列化可以是将某些内容转储到磁盘的简单而有效的方式。 JSON增加了一些你需要自己整理的复杂性(例如类型,嵌套对象,类型安全) – Brandon 2013-05-07 12:37:24

+0

'best'DYM crunchier更多的牛轧糖? – 2013-05-07 12:37:43

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是不是一种格式,而只是一个无意义的文件名extenstion

+0

为什么要创建一个新类,而不是仅仅使用'FileOutputStream(file,true)'? – DeadlyJesus 2013-05-07 12:42:14

+0

由于ObjectOutputStream向文件写入标题,幻数ACED等,我的版本将其封锁,否则ObjectInputStream将永远无法读取此混乱。其实它很容易测试,虽然我没有,因为我知道结果 – 2013-05-07 12:46:21

3

你可以通过真实的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)并每次覆盖该文件。这增加了一些额外的开销,但在事物的宏伟计划中,可能很少,不值得担心。

而且,它是最好的对象添加到文件,或保存一个 ArrayList中,我的对象添加到?

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

此外,.sav是最佳文件格式?我可以使用.txt吗?我也在某处看过.bin。我该如何选择?

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

.bin是可以接受的,因为格式实际上是二进制的。因为它更清晰,所以我建议.bin覆盖.sav。除了数据保存在那里以外,保存不会告诉我任何其他的东西。它不会比.data好