【问题标题】:How to append to an ObjectInputStream without getting java.io.StreamCorruptedException: invalid type code: AC? [duplicate]如何在不获取 java.io.StreamCorruptedException:无效类型代码:AC 的情况下附加到 ObjectInputStream? [复制]
【发布时间】:2010-07-05 21:24:03
【问题描述】:

我正在尝试从文件中读取一些对象。该代码在第一次迭代中运行良好,在第二次迭代中它给出了 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();

写作不是一个迭代的过程。

谢谢你:)

【问题讨论】:

  • 你能添加一个写入文件的示例 sn-p 吗?
  • 对象大小是个问题吗?我写的每个对象都有一个图像对象(图标)
  • readObject() 返回 null 之前循环是不正确的。它不会在流结束时执行此操作,并且它可以在您写入 null 的任何其他时间执行此操作。你需要循环直到EOFException被抛出。

标签: java file-io


【解决方案1】:

(我在写入阶段附加到文件中)

这就是问题所在。您不能附加到 ObjectOutputStream。这肯定会破坏流,你会得到 StreamCorruptedException。

但我已经在 SO 上留下了解决此问题的方法:AppendableObjectOutputStream

编辑

从作者那里我看到你写了一个检查对象并刷新并关闭流。从读者那里,我清楚地看到,您正在尝试读取多个检查对象。你可以阅读第一个,但不能阅读其余的。所以对我来说很清楚,您重新打开 Stream 并附加越来越多的检查对象。这是不允许的。

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

【讨论】:

  • 是的,这正是我在这里所做的。谢谢你。有没有其他方法可以按照我的方式编写文件并使用标准读取机制?
  • 您可以将所有检查写入单独的文件 - 但对于一个文件,您必须在一个会话中写入。 (或使用我的课程 - 那么您不必更改太多代码)
  • 再次感谢,看来使用你的课程是更好的解决方案
【解决方案2】:

在不关闭底层 FileInputStream 的情况下创建一个新的 ObjectInputStream 可以解决这个问题:

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

【讨论】:

  • 这个答案解决了使用多个 ObjectOutputStream 实例来编写单独支票的根本问题,所以如果文件来自第三方,这是要走的路
  • 您现在只需要神奇地知道何时打开一个新的ObjectInputStream。解决办法其实是一开始就不引起问题。
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多