如何编写和读取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是一个ArrayList
或LinkedList
,或另一个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)。
我认为你必须写每个对象到一个自己的文件,或者你必须拆分一个阅读时。 您也可以尝试序列化您的列表,并在反序列化时检索。