2016-04-30 3 views
2

Я хочу написать файл объекта с добавлением. У меня есть класс NewContact и основной класс ниже:Write ObjectOutputStream добавить файл, продолжить получать сообщение об ошибке StreamCorruptedException

private String name; 
    private String sex; 
    private String mail; 
    private String phone; 
    private String image; 
    //setter and getter method. removed it to avoid the long post. 

    public NewContact() { 
    } 

    public NewContact(String name, String sex, String phone, String mail, String image) { 
     this.name = name; 
     this.sex = sex; 
     this.mail = mail; 
     this.phone = phone; 
     this.image = image; 

    } 

    public String Xuat() 
    { 
     return this.getName()+" "+this.getSex()+" "+this.getPhone()+" "+this.getMail()+" "+this.getImage(); 

    } 
    @Override 
    public String toString(){ 
     //return this.name+" "+this.sex+" "+this.phone+" "+this.mail+" "+this.image; 
     return this.getName()+" "+this.getSex()+" "+this.getPhone()+" "+this.getMail()+" "+this.getImage(); 
    } 





///main class 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
      File file = new File("F:\\students.txt"); 
      ArrayList<NewContact> students = new ArrayList<NewContact>(); 
      students.add(new NewContact("Tom","Male","99245","[email protected]","sdgsg")); 
      students.add(new NewContact("Mark","Male","365465","[email protected]","sdgsg")); 
      students.add(new NewContact("Dave","Male","35346","[email protected]","sdgsg")); 

      FileOutputStream fo = new FileOutputStream(file,true); 
      ObjectOutputStream output = new ObjectOutputStream(fo); 

      for (NewContact s : students) { 
       output.writeObject(s); 
       //output.reset(); 

      } 
      output.close(); 
      fo.close(); 

      FileInputStream is = new FileInputStream(file); 
      ObjectInputStream input = new ObjectInputStream(is); 

      try { 
       while(true) { 
         NewContact s = (NewContact)input.readObject(); 
         System.out.println(s); 
       } 
      } catch (EOFException ex) { 

      }   
     } 

вчера я боролся с этой проблемой в течение всего дня. Не мог работать. Если я просто напишу нормальный (без добавления), все будет в порядке. Но когда я пытаюсь добавить его, он продолжает получать ошибку StreamCorruptedException: недопустимый код типа: AC.

В ходе исследования, я даже добавил этот класс

public class AppendingObjectOutputStream extends ObjectOutputStream{ 
    public AppendingObjectOutputStream(OutputStream out) throws IOException { 
    super(out); 
    } 

    @Override 
    protected void writeStreamHeader() throws IOException { 
    // do not write a header, but reset: 
    // this line added after another question 
    // showed a problem with the original 
    reset(); 
    } 
} 

все еще не работает :(.

ответ

1

ObjectOutputStream пишет заголовок потока каждый раз, когда она будет открыта. Но этот заголовок должен появиться только один раз, начало файла. Когда вы добавляете к существующему файлу, вы должны блокировать запись этого заголовка, например:

ObjectOutputStream output = new ObjectOutputStream(fo) { 
     @Override 
     protected void writeStreamHeader() throws IOException { 
     } 
+0

В частности, заголовок записывается, когда поток открыт (для вывода). –

+0

Я уже пробовал это раньше, но не работает :( –

+0

@StephenC на самом деле я сделал это раньше. даже попытался добавить «reset()»; в методе writeStreamHeader, но это не помогает :(. –