如何附加到ObjectInputStream而不获取java.io.StreamCorruptedException:无效类型代码:AC?

如何附加到ObjectInputStream而不获取java.io.StreamCorruptedException:无效类型代码:AC?,java,file-io,Java,File Io,我正在尝试从文件中读取一些对象。代码在第一次迭代中运行良好,在第二次迭代中,它给出了StreamCorruptedException。这是我的密码 private ArrayList<Cheque> cheques = null; ObjectInputStream ois = null; try { cheques = new ArrayList<Cheque>(4); ois = new ObjectIn

我正在尝试从文件中读取一些对象。代码在第一次迭代中运行良好,在第二次迭代中,它给出了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);
        }
我不明白为什么会这样。在一些论坛帖子中,我发现当您在编写文件时附加到文件时会发生这种情况。这是真正的原因吗?。(在编写阶段,我将附加到文件中)。 如果是这样的话,有没有正确的方法来读取附加文件

下面是我用来写入文件的代码

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

 objectOut.writeObject(cheque);
 objectOut.flush();
 objectOut.close();
写作不是一个反复的过程

谢谢:)

(我在编写阶段追加到文件)

这就是问题所在。不能附加到ObjectOutputStream。这将彻底破坏流,您将得到StreamCorruptedException

但是我已经留下了一个解决这个问题的方法:一个

编辑

从writer中,我看到您写入一个支票对象,并刷新和关闭流。从读者那里,我清楚地看到,您试图阅读多个支票对象。你可以读第一个,但不能读其余的。因此,对我来说,非常清楚的是,您重新打开流并附加越来越多的支票对象。这是不允许的


您必须在“一个会话”中写入所有支票对象。或者使用AppendableObjectOutputStream而不是标准ObjectOutputStream

在不关闭基础FileInputStream的情况下创建新的ObjectInputStream可以解决此问题:

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

您是否也可以向文件中添加写入的示例片段?对象大小是否可能是一个问题?我正在编写的每个对象都有一个图像对象(图标),在
readObject()
返回null之前循环是不正确的。它不会在流的末尾这样做,并且它可以在您编写null的任何其他时间这样做。您需要循环,直到抛出
EOFEException
。是的,这正是我在这里要做的。非常感谢。是否有其他方法可以像我这样编写文件并使用标准的读取机制?您可以将所有支票写入单独的文件,但对于一个文件,您必须在一个会话中写入。(或者使用我的类-这样您就不必更改太多代码)再次感谢,似乎使用您的类是更好的解决方案此答案解决了使用多个ObjectOutputStream实例编写单独支票的根本问题,因此如果文件来自第三方,这是实现目标的方法,您现在需要的是神奇地知道何时打开新的
ObjectInputStream
。解决办法实际上不是首先造成问题。
    FileInputStream fin = new FileInputStream(file);
    while (...) {
        ObjectInputStream oin = new ObjectInputStream(fin);
        Object o = oin.readObject();
        ...
    }
    fin.close();