所以这是我的问题:
对于一个项目,我必须创建一个自定义的链表,从而必须向其中添加节点,并使用序列化将其保存到磁盘或从磁盘中加载/加载。
在定义问题之前,这是关于系统的一些事情
我有一个通用的“客户文件”作为节点数据
它存储在节点对象中,该节点对象充当列表的元素
有一个客户文件类,用于存储名称和电子邮件地址等信息,以及每个文件的各种获取和设置方法-这些工作正常
有一个节点类,其中包含get和set数据以及每个方法的next方法,其中下一项是节点对象,并充当列表中的下一项
有一个带有添加,删除,修改,排序,搜索等方法的单链接类-这是一个定制类,因此不执行任何JAVA预制列表。
已经对所有类分别进行了很多测试并一起使用-这些方法非常安全-它们有效
有一个主类用于用户和系统之间的主界面-这是一个CLI系统(命令行)
它具有文件功能的保存列表和文件功能的加载列表(在主类中),因此每个函数都使用序列化或反序列化从磁盘保存/加载列表
所有类都实现可序列化的接口
在主类中有一个“ MAIN”方法,通过while循环操作,用户可以通过某种方式修改列表(例如,添加记录,删除记录等)。
该列表已加载到循环外部,因此每次循环迭代时都不会清除该列表(同事之间的常见问题)
我有一个系统密码,使用该密码可以使用相同的方法将字符串保存到另一个文件位置,并且已经使用了数周了-该密码保存在该位置,可以随意访问,更改和删除
这些加载/保存方法具有适当的try / catch方法来捕获任何异常
问题是,每次我加载编程环境并希望查看列表时,我发现文件上的列表为“空”,并且从上次添加/删除内容起没有任何记录。
我添加记录并修改列表-与其他类一起工作很容易-添加这些记录后,我调用了print函数,该函数只显示列表中的所有项目,就可以了。
但是,当我关闭环境的那一刻,它们丢失了,当我重新打开环境以再次查看列表时,它是空的!
在保存这些类的文件夹中查找时,我注意到每次运行该程序时都会创建“ 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();
}
}
同样,加载列表方法类似,但是使用对象输入流和文件输入流。
有什么建议么?
附言我的主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行代码(很多方法)。
最佳答案
写入文件/对象后,是否尝试过在close()
上调用FileOutputStream
?