我用包含数据变量和下一个节点变量的节点对象制作了一个单链表。客户对象存储在数据变量中,客户文件有一个姓氏变量和一个名字变量,如下所示:
public customer
{
String Surname;
String Forename;
get and set methods for each;
}
链接列表和节点类将按姓氏 (AZ) 升序排序,因此 George Clooney 排在 Jay Gatsby 之前。用于在链表中递归插入项目的方法很好,在尝试使用 and 保存文件或使用 and 加载文件之前,我已经运行了ObjectOutputStream
许多FileOutputStream
测试。ObjectInputStream
FileInputStream
作为我所做的所有研究的结果,我得出的结论是,最好使用自定义链表(不是标准 Java 列表)上的可序列化接口将整个链表保存为对象,以将其序列化并保存到文件。
现在,这是我的问题:我添加了 1 个带有随机姓氏的 Node 对象,它工作正常:每次添加项目时,列表都会从文件中反序列化并加载到新SinglyLinkedList
对象中。ObjectOutputStream
新节点被添加并放置在列表中的正确位置,然后这个新列表通过和传递回文件FileOutputStream
。
我添加了一项,这很好;但是,如果我添加另一个,它说它很好(没有错误 - 我有所有适当的try
和catch
声明),但它实际上并没有更新列表。print 方法强化了这一点,因为它也以相同的方式访问列表并且只打印第一项(即使添加了更多项)。当我询问列表的长度时,它只是给了我第一项(例如返回 1)。
如果我关闭它并重新运行它,我将再次收到相同的 1 个节点,仅此而已。然后,如果我要添加另一个,它就不会再工作了。
以下是一些有用的信息:
- 客户文件、节点和单链表类具有必要的可序列化导入并实现可序列化标头
- 有 4 个单独的类,客户文件 - 包含数据,节点 - 包含客户文件和下一个节点,单链表 - 包含编辑列表的所有方法和主类,其中包含所有扫描仪和可序列化流对象(例如 ObjectOutputStream)并从键盘获取命令和数据(例如“ADD”、“PRINT”)
- 有单独的方法可以保存和加载到文件中,这些方法用于减少屏幕上的代码覆盖率——这可能是问题所在——我是这个新手,但这里是代码。
在 MAIN METHOD 中添加节点的代码 - 不是递归例程
CustomerFile custDat = new CustomerFile(fName,sName);
Node custNode = new Node(custDat, null);
SinglyLinkedList a = loadListFromFile();
if (a == null)
{
System.out.println("Creating new list");
SinglyLinkedList newList = new SinglyLinkedList();
newList.addRecord(custNode, null);
a = newList;
}
else
{
a.addRecord(a.getHead(), custNode);
}
saveListToFile(a);
System.out.println("File added successfully");
并且loadListFromFile
方法(保存列表方法类似,但有输出)有一个集合fileName
:
private static SinglyLinkedList loadListFromFile()
{
SinglyLinkedList lst = null;
try
{
ObjectInputStream is = new ObjectInputStream(new FileInputStream(fileName));
lst = (SinglyLinkedList) is.readObject();
is.close();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
return lst;
}