2013-03-28 25 views
3

我查看了一些關於此問題的問題,但無法解決我的問題。如何將序列化文件加載回arrayList

正如您在下面看到的,我通過序列化將我的Patient ArrayListpList - 這是私人的類在頂部)保存到「Patient.ser」文件中的所有對象。據我所知,這是沒有問題的工作。 「patSizeAtSave」是我使用的標記爲綁定加載文件時一起工作(見下文)

私有變量「patModel」是DefaultListModel我在GUI使用的JLists,所以我嘗試用填充了什麼添加回Patient ArrayList(pList)

我的問題這些列表:當我擊中了GUI Load按鈕它調用下面的方法loadPatientList(),但什麼都沒有把我的JList的,所以我不能告訴它是否工作。

任何想法如何解決這個問題?

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); 
    } 
} 

回答

4

您是否嘗試在保存後將您的患者列表加載到相同的JVM中(無需退出JVM)? 因爲如果您在重新載入患者列表之前退出JVM,您的patSizeAtSave將被重置爲0(因爲它未保存到任何文件/ persitent存儲),但僅在內存中。當您將在新的JVM中調用loadPatientList時,您的for循環將不會加載任何患者,因爲patSizeAtSave爲0.

您應該保存整個列表pList(假設您使用List的Serializable實現,例如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()); 
} 

這樣,列表的大小也將被保存在你的序列化文件。

Regards

+0

謝謝你這麼多人!那現在沒有問題了! 這是一個與私人變量patSaveAtSize愚蠢的錯誤,我忘了它已經不存在了...... 但是,我曾嘗試通過保存和加載整個arraylist作爲一個對象之前,但我沒有做的是包括「」在ArrayList中轉換回代碼的一部分。非常感謝,再次。 – Chris

+0

我很高興能夠提供幫助。您能否投票並將您的問題標記爲已回答。在此先感謝您的時間。 – Marc

+0

涼爽的男人多數民衆贊成在做,即時通訊新的這個網站如此生病請務必記住在未來包裝它 – Chris