2013-03-25 2 views
3

Предположим, что у вас есть некоторый AppendObjectOutputStream класс (который является ObjectOutputStream!), Который перекрывает writeStreamHeader(), как это:добавляющим объектов к сериализации файла

@Override 
public void writeStreamHeader() throws IOException 
{ 
    reset(); 
} 

Теперь же, скажем, вы планируете на сохранение нескольких объектов в файл; один объект для каждого запуска вашей программы. Не могли бы вы даже при первом запуске использовать AppendObjectOutputStream()?

+1

Вы не хотите этого делать. Вы столкнетесь с тонкими семантическими ошибками с обменом ссылками в зависимости от того, где начинается новый подпоток. – EJP

+0

Итак, что предлагается (и маршрут, который я закончил), это написатьStreamHeader() в первый раз, используя простой ObjectOutputStream, а затем добавить записи с AppendObjectOutputStream, как определено выше? –

ответ

7

Вы должны сначала написать заголовок потока с помощью обычного объекта ObjectOutputStream, иначе вы получите java.io.StreamCorruptedException при открытии файла с ObjectInputStream.

public class Test1 implements Serializable { 

    public static void main(String[] args) throws Exception { 
     ObjectOutputStream os1 = new ObjectOutputStream(new FileOutputStream("test")); 
     os1.writeObject(new Test1()); 
     os1.close(); 

     ObjectOutputStream os2 = new ObjectOutputStream(new FileOutputStream("test", true)) { 
      protected void writeStreamHeader() throws IOException { 
       reset(); 
      } 
     }; 

     os2.writeObject(new Test1()); 
     os2.close(); 

     ObjectInputStream is = new ObjectInputStream(new FileInputStream("test")); 
     System.out.println(is.readObject()); 
     System.out.println(is.readObject()); 
+0

Это именно то, что я делаю в первый раз; сначала записывая заголовок файла с помощью обычного объекта ObjectOutputStream, а затем на всех других сеансах этой программы, используя AppendObjectOutputStream, но я все равно получаю StreamCorruptedException! // На самом деле, я запускаю свою программу для ОЧЕНЬ ПЕРВЫЙ РАЗ: неверный заголовок потока: 79737200. Самая верхняя запись из моего кода в callstack происходит из записей = new ObjectInputStream (новый FileInputStream («record.ser»)); оператор –

+0

попробуйте мой тест, он определенно работает, я подозреваю, что вы не закрываете выходной поток –

+0

Выходной поток закрывается; Мне жаль, что я не могу отправить вам файлы Java, но я работаю над математической игрой, которую я на самом деле намерен играть, и я не хочу, чтобы люди использовали мой код, плавающий вокруг. –

Смежные вопросы