Java.io.StreamCorruptedException: недопустимый код типа: AC

Я пытаюсь прочитать некоторые объекты из файла. Код работает отлично для первой итерации, а на второй итерации он дает исключение StreamCorruptedException. Вот мой код,

private ArrayList<Cheque> cheques = null;
ObjectInputStream ois = null;
        try {
            cheques = new ArrayList<Cheque>(4);
            ois = new ObjectInputStream(new FileInputStream("src\\easycheque\\data\\Templates.dat"));
            Object o = null;
            try {
                o = ois.readObject();
                int i=1;
                while (o != null) {
                    cheques.add((Cheque) o);
                    System.out.println(i++); // prints the number of the iteration
                    o = ois.readObject(); // exception occurs here
                }
            } catch (ClassNotFoundException ex) {// for ois readObject()
                Logger.getLogger(TemplateReader.class.getName()).log(Level.SEVERE, null, ex);

            } catch (EOFException ex) {// for ois readObject()
                // end of the file reached stop reading
                System.out.println("ois closed");
                ois.close();

            }
        } catch (IOException ex) {
            Logger.getLogger(TemplateReader.class.getName()).log(Level.SEVERE, null, ex);
        }

ниже является частью исключения. Перед печатью это '1' печатается (из-за sout)

SEVERE: null
java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 

Я не могу понять, почему это происходит. В нескольких сообщениях на форуме я сталкивался с тем, что это происходит, когда вы добавляете файл во время его написания. Это настоящая причина?. (Я добавляю файл во время записи). Если есть подходящий способ для чтения прилагаемого файла?

вот код, который я использую для записи в файл

 ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream("src\\easycheque\\data\\templates.dat", true));

 objectOut.writeObject(cheque);
 objectOut.flush();
 objectOut.close();

запись не является итерационным процессом.

Спасибо:)

Ответ 1

(Я добавляю к файлу на этапе написания)

И в этом проблема. Вы не можете добавить объект ObjectOutputStream. Это наверняка испортит поток, и вы получите StreamCorruptedException.

Но я уже оставил решение этой проблемы на SO: AppendableObjectOutputStream

ИЗМЕНИТЬ

От писателя я вижу, что вы пишете объект один, и очищаете и закрываете поток. От читателя я ясно вижу, что вы пытаетесь прочитать более одного объекта проверки. И вы можете прочитать первый, но не все остальное. Поэтому мне совершенно ясно, что вы снова открываете Stream и добавляете все больше объектов проверки. Что не разрешено.

Вам нужно написать all объекты проверки в "одном сеансе". Или используйте AppendableObjectOutputStream вместо стандартного ObjectOutputStream.

Ответ 2

Создание нового объекта ObjectInputStream без закрытия базового FileInputStream решает эту проблему:

    FileInputStream fin = new FileInputStream(file);
    while (...) {
        ObjectInputStream oin = new ObjectInputStream(fin);
        Object o = oin.readObject();
        ...
    }
    fin.close();