如下所示,我通过序列化将Patient ArrayList
(pList
(在课堂顶部是私有的)中的所有对象保存到“Patient.ser”文件中。据我所知,这没有问题。 “patSizeAtSave
”是一个私有变量,我用它来标记为加载文件时的约束(见下文)
“patModel
”是我在DefaultListModel
中JLists
使用的GUI
,因此我尝试将这些列表添加回Patient ArrayList(pList)
{1}}
我的问题:当我点击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);
}
}
答案 0 :(得分:4)
您是否尝试在保存后在同一个JVM中加载患者列表(不退出JVM)? 因为如果在重新加载患者列表之前退出JVM,则patSizeAtSave将重置为0(因为它不会保存到任何文件/ persitent存储中),而只会保存在内存中。当您在新JVM中调用loadPatientList时,由于patSizeAtSave为0,您的for循环将不会加载任何患者。
您应该保存整个列表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());
}
这样,列表大小也将保存在序列化文件中。
问候