如何在Java中读取,更新,插入,删除对象到txt文件

时间:2019-06-19 20:48:32

标签: java database io

我正在创建一个代表布管系统的命令行界面。我需要将.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文件中?谢谢大家!

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点:

  1. 在每次操作开始时将文件加载到内存中,然后在末尾保存

    • 缓慢,麻烦,但不需要您知道应用程序何时退出。
  2. 在应用程序启动时将文件加载到内存中,在内存中进行操作,在应用程序关闭时保存到文件中

    • 具有不经常读取(每次运行一次)的优点,但是如果应用程序突然退出,则会遇到问题。
  3. 将每个书本对象保存在文件中,并使用键(书本ID?名称?)作为文件名。

    • 缺点:id必须是唯一的,如果不打开(最坏的情况)所有文件,则无法搜索其他属性。文件系统中有很多文件。
    • 优点:快速访问特定书籍。易于维护(只需在每次操作中打开所需的文件)。不需要读取任何无用的数据。

只有几个选项可供您考虑。

答案 1 :(得分:0)

这里有一些评论,但有一点警告,我有一段时间没有直接将对象序列化到文件了。

  1. 您说的是txt文件,但正在使用将写入二进制文件的对象序列化程序。这不是主要问题,但有些令人困惑。如果您需要将其作为文本,则需要一个序列化程序,该序列化程序将以基于文本的格式(例如CSV,JSON,XML)对对象进行序列化。但是,这可能与以下几点不兼容。
  2. 如果数据集很大,则为避免重写所有数据以进行保存(如果保存在单个文件中)的高性能解决方案需要使用固定大小的记录,以便可以通过RandomAccessFile将其覆盖。然后通过将记录标记为已删除(而不是实际上从文件中删除它们)并进行压缩操作来最终完成记录的删除,这些压缩操作最终将在必要/触发时将数据写入新文件时将其删除。
  3. 否则,要更新文件,您需要使用新状态再次写入整个文件。假设这是一个命令行应用程序,那么运行该命令导致更新的每个实例都意味着要再次写入更改的文件。与使用RandomAccessFile相比,这可能更容易实现,但是对于大型数据集(100到MB到GB等)可能是性能问题。
  4. 如果用最新状态重写所有文件,则理想情况下应写入一个新的临时文件,并自动移动它以替换旧文件。失败者应该锁定正在写入的文件。这样可以防止出现错误时损坏数据库(如果新写入在旧文件仍然存在的地方失败),并防止并发相关问题。

最后,如果您使用数据库系统(许多选项),这些问题已经为您解决。