我正在考虑制作一个可以帮助我跟踪饮食的小项目。我的第一个障碍是构建一个食物类型对象库并将它们写入文件。
我按照本指南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 :(得分:6)
FileOutputStream saveFile = new FileOutputStream("SaveObj.sav", true);
创建文件输出流以写入由指定的File对象表示的文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头。
答案 1 :(得分:3)
您可以通过将true传递给FileOutputStream构造函数来附加到文件的末尾,如
然而,这提出了一个有趣的问题。在阅读文件时,您如何知道保存了多少对象?要读入每个对象,你想要为每个对象调用一次readObject N次,但是你需要知道N是什么,否则你读过文件的末尾并且这是不好的。
我能想到两种解决方案:
像软件中的所有东西一样,它取决于。我给了你一些优点和缺点,以帮助你决定,但你的milage可能会有所不同。就个人而言,我会使用一个ArrayList并将其序列化,但我没有完整的需求图片,所以我不会说它是“最好的”。此外,最好将对象添加到文件中,还是保存 我将对象添加到?
的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的最佳方式。