2010-05-21 166 views
0

我们有一个应用程序需要我们使用反序列化动态读取文件(.dat)中的数据。实际上,我们获取第一个对象,并在使用“for”循环访问其他对象时抛出空指针异常。从.dat文件中检索数据

  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

可能重复[如何读取追加模式文件(.DAT)数据(http://stackoverflow.com/questions/2880498/how-to - 读取 - 数据 - 从文件-DAT-在-附加模式) – McDowell 2010-05-21 14:16:51

回答

1

问题是while循环:

while(ois.readObject()!=null){ 
    m1=(MemberAccount)ois.readObject(); 
    System.out.println(m1.toString()); 
} 

您正在阅读从流的对象,检查它是否不为空,然后再阅读从流。现在,流可以为空,返回null。

你可以代替这样做:

while(ois.available() > 0){ 
    m1=(MemberAccount)ois.readObject(); 
    System.out.println(m1.toString()); 
}