如何在追加模式下从文件(.dat)读取数据

时间:2010-05-21 08:13:25

标签: java

我们有一个应用程序,它要求我们使用反序列化动态地从文件(.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(); 
} 

2 个答案:

答案 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解码。