1

所以这是我的问题:对于一个项目,我必须创建一个自定义链表,我必须向其中添加节点并使用序列化将其保存/加载到磁盘和从磁盘中加载/在我定义问题之前,这是关于我的系统的一些事情

  • 我有一个通用的“客户文件”,它充当节点数据
  • 这存储在充当列表元素的节点对象中
  • 有一个客户文件类,其中存储了姓名和电子邮件地址等信息,以及各种获取和设置方法 - 这些工作正常
  • 有一个节点类,其中包含获取和设置数据以及下一个方法,其中下一项是节点对象并充当列表中的下一项
  • 有一个带有添加、删除、修改、排序、搜索等方法的单链接类 - 它是自定义类,因此不实现任何 JAVA 预制列表。
  • 对所有类分别进行了很多测试并一起使用-这些方法是万无一失的-它们有效
  • 有一个主类用于用户和系统之间的主界面 - 它是一个 CLI 系统(命令行)
  • 它有一个保存列表到文件函数和从文件函数加载列表(在主类中),每个函数使用序列化或反序列化从磁盘保存/加载列表
  • 所有类都实现了可序列化的接口
  • 主类中有一个“MAIN”方法,其中运行一个while循环,允许用户以某种方式修改列表(例如添加记录,删除记录等......)
  • 该列表在循环之外加载,因此每次循环迭代时都不会清除它(同事之间的常见问题)
  • 我有一个系统密码,使用相同的方法将字符串保存到另一个文件位置,并且已经工作了数周 - 密码保存在该位置,可以随意访问、更改和删除
  • 这些加载/保存方法具有适当的 try/catch 方法来捕获任何异常

问题是每次我加载我的编程环境并想查看列表时,我发现文件中的列表是“空的”并且不包含我上次添加/删除内容时的记录。

我添加记录并修改列表——在其他类工作时很容易——一旦添加这些,我调用打印函数,它只显示列表中的所有项目,这很好。

但是,在我关闭环境的那一刻,它们就丢失了,当我重新打开环境再次查看列表时,它是空的!

在查看保存这些类的文件夹时,我注意到每次运行程序时都会创建“shell”并保留在那里直到程序关闭/完成,但是应该保存链接列表的“listData.ser”没有任何数据。

同样,密码文件包含保存完好的密码 - 所以我对我的代码为什么不起作用感到有点困惑。

这是我的保存列表方法:

private static void saveListToFile(SinglyLinkedList lst) {
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("ListData.ser"));
        os.writeObject(lst);
        os.flush();
        os.close();
    } 

    catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    catch (IOException e) {
        e.printStackTrace();
    }
}

同样,加载列表方法类似,但使用对象输入流和文件输入流。

有什么建议么?

PS 我的主 while 循环超过 400 行代码,因此无法发布。

更新1.加载列表方法中的反序列化代码:

private static SinglyLinkedList loadListFromFile() {
    SinglyLinkedList lst = null;

    try {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("ListData.ser"));
        lst = (SinglyLinkedList) is.readObject();
        is.close();
    }

    catch(FileNotFoundException e) {
        e.printStackTrace();
    }

    catch(IOException e) {
        e.printStackTrace();
    }

    catch(ClassNotFoundException e) {
        e.printStackTrace();
    }

    return lst;
}

我不认为单链表类本身是问题(回复评论)并且复制是不可行的,因为它也是超过 300 行代码(很多方法)。

4

2 回答 2

0

您是否尝试过close()FileOutputStream完成文件/对象的编写后调用?

于 2013-01-22T18:06:10.230 回答
0

我已经解决了它,而不是发布我的代码,我尝试自己做。我发现列表类有一些静态方法 - 这些方法已更改为非静态方法,现在列表每次都按预期保存。谢谢您的帮助

于 2013-01-25T09:45:09.863 回答