Java 如何将序列化文件加载回arrayList
我已经考虑过这件事上的一些问题,但无法解决我的问题 如下所示,我通过序列化将我的Java 如何将序列化文件加载回arrayList,java,arraylist,load,jlist,serializable,Java,Arraylist,Load,Jlist,Serializable,我已经考虑过这件事上的一些问题,但无法解决我的问题 如下所示,我通过序列化将我的Patient ArrayList(pList-在类的顶部是私有的)中的所有对象保存到“Patient.ser”文件中。据我所知,这是没有问题的工作。“patSizeAtSave”是一个私有变量,我正在使用它来标记为加载文件时要使用的绑定(见下文) “patModel”是我在我的GUI中用于jlist的DefaultListModel,因此我尝试用添加回患者阵列列表(pList)的内容填充这些列表。 我的问题:当我点
Patient ArrayList
(pList
-在类的顶部是私有的)中的所有对象保存到“Patient.ser”文件中。据我所知,这是没有问题的工作。“patSizeAtSave
”是一个私有变量,我正在使用它来标记为加载文件时要使用的绑定(见下文)
“patModel
”是我在我的GUI
中用于jlist
的DefaultListModel
,因此我尝试用添加回患者阵列列表(pList)的内容填充这些列表。
我的问题:当我点击GUI
上的加载按钮时,它会调用下面的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);
}
}
private void savePatientList()引发FileNotFoundException{
尝试
{
FileOutputStream fs=新的FileOutputStream(“Patient.ser”);
ObjectOutputStream os=新的ObjectOutputStream(fs);
用于(患者p:pList)
{
os.writeObject(p);
}
fs.close();
os.close();
patSizeAtSave=pList.size();
显示消息对话框(jTabPane,“保存完成!”,“通知”,JOptionPane.INFORMATION\u消息);
}
捕获(IOEX异常){
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE,null,ex);
}
}
私有void loadPatientList()
{
文件输入流;
目的输入流是;
尝试
{
fs=新文件输入流(“Patient.ser”);
is=新的ObjectInputStream(fs);
对于(int i=0;i
保存后是否尝试将患者列表加载到同一JVM中(不退出JVM)?
因为如果在重新加载患者列表之前退出JVM,则patSizeAtSave将重置为0(因为它不会保存到任何文件/持久存储),而只保存在内存中。在新JVM中调用loadPatientList时,for循环不会加载任何患者,因为patSizeAtSave为0
您应该保存整个列表pList(假设您使用列表的可序列化实现,如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());
}
pList=(List)是.readObject();
用于(患者p:pList)
{
patModel.addElement(p.getPNo()+“:”+p.getPName());
}
这样,列表大小也将保存在序列化文件中
问候非常感谢你,伙计!现在工作没有问题了!私有变量patSaveAtSize出现了一个愚蠢的错误,我忘了它不见了。。。不过,我以前确实尝试过将整个arraylist作为对象保存和加载,但我没有做的是在代码的arraylist回溯部分包含“”。再次非常感谢。很高兴我能帮忙。请您投票并将您的问题标记为已回答。提前谢谢你的时间。酷男人:好了,我是这个网站的新手,所以我以后一定要记得把它总结一下