【问题标题】:How to load a serialized file back to an arrayList如何将序列化文件加载回arrayList
【发布时间】:2013-03-19 01:16:36
【问题描述】:

我已经在这个问题上查看了一些问题,但无法解决我的问题。

如下所示,我通过序列化将我的Patient ArrayListpList - 这是类顶部的私有对象)中的所有对象保存到“Patient.ser”文件中。据我所知,这是没有问题的。 “patSizeAtSave”是一个私有变量,我在加载文件时用来标记为绑定(见下文)

patModel”是我在GUI 中用于JListsDefaultListModel,所以我尝试用添加回Patient ArrayList(pList) 的内容填充这些列表

我的问题:当我点击GUI 上的加载按钮时,它会调用下面的loadPatientList() 方法,但我的JLists 中没有任何内容,所以我不知道它是否有效一点也不。

关于如何解决这个问题的任何想法?

private void savePatientList() throws FileNotFoundException {
    try
    {
    FileOutputStream fs = new FileOutputStream("Patient.ser");
    ObjectOutputStream os = new ObjectOutputStream(fs);
    for(Patient p: pList)
    {
        os.writeObject(p);
    }
    fs.close();
    os.close();
    patSizeAtSave = pList.size();
    JOptionPane.showMessageDialog(jTabPane, "Save Complete!", "Notification", JOptionPane.INFORMATION_MESSAGE);
    } 
    catch (IOException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } 

}
private void loadPatientList()
{
    FileInputStream fs;
    ObjectInputStream is;
    try
    {
    fs = new FileInputStream("Patient.ser");
    is = new ObjectInputStream(fs);

    for(int i = 0; i < patSizeAtSave; i++)
    {
        Patient p = (Patient) is.readObject();
        pList.add(p);
        patModel.addElement(p.getPNo() + ": " + p.getPName());
    }
    jListPatient.setModel(patModel);
    jListPatient2.setModel(patModel);
    fs.close();
    is.close();
    } 
    catch (FileNotFoundException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException | ClassNotFoundException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
}

【问题讨论】:

    标签: java arraylist load jlist serializable


    【解决方案1】:

    您是否尝试在保存后将患者列表加载到同一个 JVM 中(不退出 JVM)? 因为如果您在重新加载患者列表之前退出 JVM,您的 patSizeAtSave 将被重置为 0(因为它不会保存到任何文件/永久存储中),而只会在内存中。当您在新的 JVM 中调用 loadPatientList 时,您的 for 循环不会加载任何患者,因为 patSizeAtSave 为 0。

    您应该保存整个列表 pList(假设您使用 List 的可序列化实现,例如 ArrayList / LinkedList),如下所示:

    FileOutputStream fs = new FileOutputStream("Patient.ser");
    ObjectOutputStream os = new ObjectOutputStream(fs);
    os.writeObject(pList);
    

    然后用 :

    加载它
    pList = (List<Patient>) is.readObject();
    for(Patient p: pList)
    {
        patModel.addElement(p.getPNo() + ": " + p.getPName());
    }
    

    这样,列表大小也将保存在您的序列化文件中。

    问候

    【讨论】:

    • 非常感谢你!那现在可以正常工作了!这是私有变量 patSaveAtSize 的一个愚蠢错误,我忘记它已经消失了......但是我之前确实通过将整个数组列表保存并加载为对象来尝试过,但我没有做的是在ArrayList 回滚部分代码。再次非常感谢。
    • 很高兴我能帮上忙。请您投票并将您的问题标记为已回答。提前感谢您的宝贵时间。
    • 帅哥就这样完成了,我是这个网站的新手,所以一定要记得在以后把它包起来
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2017-03-08
    • 2013-07-11
    • 2017-06-23
    • 2017-09-27
    • 2012-06-23
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多