Как читать данные из файла (.dat) в режиме добавления - PullRequest
0 голосов
/ 21 мая 2010

У нас есть приложение, которое требует от нас динамического чтения данных из файла (.dat) с использованием десериализации. На самом деле мы получаем первый объект, и он выдает исключение нулевого указателя и «java.io.StreamCorruptedException: недопустимый код типа: AC», когда мы обращаемся к другим объектам, используя цикл «for».

        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 голосов
/ 21 мая 2010

Грамматика для сериализованных объектов определяется как:

stream:
  magic version contents

Используя опцию добавления (new FileOutputStream(file,true);), вы создаете файл со следующими данными:

stream:
  magic version contents magic version contents magic version contents ....

Эти данные не соответствуют спецификации и не могут быть декодированы с помощью ObjectInputStream.

0 голосов
/ 21 мая 2010

После считывания объекта из входного потока поток указывает на следующий объект.

Попробуйте (без чтения из ois прежде):

MemberAccount m1 = null;
while( (m1=ois.readObject()) != null){ 
   System.out.println(m1.toString()); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...