2010-05-21 4 views
0

У нас есть приложение, которое требует от нас динамического чтения данных из файла (.dat) с помощью десериализации. На самом деле мы получаем первый объект и выбрасываем исключение нулевого указателя, когда мы обращаемся к другим объектам, используя цикл «для».Извлечь данные из .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 -Распознать-данные из файла-Дат-в-дописывания режима) – McDowell

ответ

1

Проблема заключается ваш цикл в то время как:

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()); 
}