如何编写和读取Java序列化对象到一个文件

我将写入多个对象到一个文件,然后检索我的代码的另一部分。 我的代码没有错误,但不能正常工作。 你能帮我找出我的代码有什么问题吗? 我已经阅读了不同网站的不同代码,但没有一个为我工作!

这里是我的代码写我的对象到一个文件:MyClassList是一个arraylist,其中包括我的课(必须写入文件)的对象。

for (int cnt = 0; cnt < MyClassList.size(); cnt++) { FileOutputStream fout = new FileOutputStream("G:\\address.ser", true); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(MyClassList.get(cnt)); } 

我向输出stream的构造函数添加了“true”,因为我想将每个对象添加到文件结尾。 那是对的吗?

这里是我的代码从文件中读取对象:

  try { streamIn = new FileInputStream("G:\\address.ser"); ObjectInputStream objectinputstream = new ObjectInputStream(streamIn); MyClass readCase = (MyClass) objectinputstream.readObject(); recordList.add(readCase); System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } 

它最终只打印一个对象。 现在,我不知道我是不是正确写作或正确阅读!

为什么不要一次将整个列表序列化?

 FileOutputStream fout = new FileOutputStream("G:\\address.ser"); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(MyClassList); 

当然,假设MyClassList是一个ArrayListLinkedList ,或另一个Serializable集合。

在阅读它的情况下,在你的代码中你只准备了一个项目,没有循环来收集所有写入的项目。

正如其他人所build议的那样,您可以一次对整个列表进行序列化和反序列化,这更简单,似乎完全符合您打算做的事情。

在这种情况下,序列化代码就变成了

 ObjectOutputStream oos = null; FileOutputStream fout = null; try{ fout = new FileOutputStream("G:\\address.ser", true); oos = new ObjectOutputStream(fout); oos.writeObject(myClassList); } catch (Exception ex) { ex.printStackTrace(); } finally { if(oos != null){ oos.close(); } } 

和反序列化(假设myClassList是一个列表,希望你会使用generics):

 ObjectInputStream objectinputstream = null; try { FileInputStream streamIn = new FileInputStream("G:\\address.ser"); objectinputstream = new ObjectInputStream(streamIn); List<MyClass> readCase = (List<MyClass>) objectinputstream.readObject(); recordList.add(readCase); System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } finally { if(objectinputstream != null){ objectinputstream .close(); } } 

您也可以按照您的意图反序列化文件中的多个对象:

 ObjectInputStream objectinputstream = null; try { streamIn = new FileInputStream("G:\\address.ser"); objectinputstream = new ObjectInputStream(streamIn); MyClass readCase = null; do { readCase = (MyClass) objectinputstream.readObject(); if(readCase != null){ recordList.add(readCase); } } while (readCase != null) System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } finally { if(objectinputstream != null){ objectinputstream .close(); } } 

请不要忘记在finally子句中closuresstream对象(注意:它可以抛出exception)。

我认为你必须写每个对象到一个自己的文件,或者你必须拆分一个阅读时。 您也可以尝试序列化您的列表,并在反序列化时检索。