我们有一个应用程序,它要求我们使用反序列化动态地从文件(.dat)中读取数据。我们实际上正在获取第一个对象,当我们使用“for”循环访问其他对象时,它会抛出空指针异常和“java.io.StreamCorruptedException:无效类型代码:AC”。
File file=null;
FileOutputStream fos=null;
BufferedOutputStream bos=null;
ObjectOutputStream oos=null;
try{
file=new File("account4.dat");
fos=new FileOutputStream(file,true);
bos=new BufferedOutputStream(fos);
oos=new ObjectOutputStream(bos);
oos.writeObject(m);
System.out.println("object serialized");
amlist=new MemberAccountList();
oos.close();
}
catch(Exception ex){
ex.printStackTrace();
}
阅读对象:
try{
MemberAccount m1;
file=new File("account4.dat");//add your code here
fis=new FileInputStream(file);
bis=new BufferedInputStream(fis);
ois=new ObjectInputStream(bis);
System.out.println(ois.readObject());
**while(ois.readObject()!=null){
m1=(MemberAccount)ois.readObject();
System.out.println(m1.toString());
}/*mList.addElement(m1);** // Here we have the issue throwing null pointer exception
Enumeration elist=mList.elements();
while(elist.hasMoreElements()){
obj=elist.nextElement();
System.out.println(obj.toString());
}*/
}
catch(ClassNotFoundException e){
}
catch(EOFException e){
System.out.println("end");
}
catch(Exception ex){
ex.printStackTrace();
}
答案 0 :(得分:0)
从输入流中读取对象后,流指向下一个对象。
尝试(之前没有读过ois):
MemberAccount m1 = null;
while( (m1=ois.readObject()) != null){
System.out.println(m1.toString());
}
答案 1 :(得分:0)
序列化对象的grammar定义为:
stream:
magic version contents
通过使用附加选项(new FileOutputStream(file,true);
),您可以使用以下数据创建文件:
stream:
magic version contents magic version contents magic version contents ....
此数据不符合规范,无法由ObjectInputStream
解码。