我正在创建一个代表布管系统的命令行界面。我需要将.txt文件用作外部数据库,每个簿记建筑物应映射到该位置存储的所有簿记的列表。我希望能够将映射到其所有书籍的每个簿记建筑对象保存在txt文件中,并且即使在我的应用程序停止运行并启动后也能够读取,更新,插入,删除相同的txt文件再次。
public static ArrayList<Object> readObjects(){
ArrayList<Object> al = new ArrayList<Object>();
boolean cont = true;
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("outputFile"));
while(cont){
Object obj=null;
try {
obj = ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(obj != null)
al.add(obj);
else
cont = false;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return al;
我当前的实现只能将数组中的对象写到新的txt文件中,但是当已有txt文件包含应用程序上次会话中的数据时,就无法更新/删除
甚至可以更新对象对象参数/删除已保存在txt文件中的整个对象,或者我必须从txt文件中恢复对象,从所述txt文件中删除所有内容,执行我需要进行的任何更新使用先前提取的对象,然后最终将对象(和/或新对象)写回到txt文件中?谢谢大家!
答案 0 :(得分:2)
有几种方法可以做到这一点:
在每次操作开始时将文件加载到内存中,然后在末尾保存
在应用程序启动时将文件加载到内存中,在内存中进行操作,在应用程序关闭时保存到文件中
将每个书本对象保存在文件中,并使用键(书本ID?名称?)作为文件名。
只有几个选项可供您考虑。
答案 1 :(得分:0)
这里有一些评论,但有一点警告,我有一段时间没有直接将对象序列化到文件了。
RandomAccessFile
将其覆盖。然后通过将记录标记为已删除(而不是实际上从文件中删除它们)并进行压缩操作来最终完成记录的删除,这些压缩操作最终将在必要/触发时将数据写入新文件时将其删除。RandomAccessFile
相比,这可能更容易实现,但是对于大型数据集(100到MB到GB等)可能是性能问题。最后,如果您使用数据库系统(许多选项),这些问题已经为您解决。