当前位置: 首页 > 面试题库 >

如何在不获取java.io.StreamCorruptedException的情况下追加到ObjectInputStream:无效的类型代码:AC?

蔡宏大
2023-03-14
问题内容

我正在尝试从文件中读取一些对象。该代码在第一次迭代中工作正常,而在第二次迭代中,它给出了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”(由于输出)

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();

写作不是一个反复的过程。

谢谢 :)


问题答案:

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

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

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

编辑

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

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



 类似资料:
  • 我有一些C代码,其中包含各种函数,每个函数都以不同类型的“handle”对象作为参数。所有这些句柄的实现都是相同的(它只是一个具有void指针和项计数的结构),因此只声明一个实现似乎是合乎逻辑的——但我还希望C编译器在用户将错误类型的句柄传递给函数时生成编译时错误。 我当前的方法使用类型定义创建各种句柄类型,它可以记录函数应该接受的句柄类型,但编译器会自动转换,因此不会将类型不匹配标记为错误。是否

  • 问题内容: 我需要将一堆列名称解析为列索引(以便使用一些不错的方法)。但是,我知道如何获取对象的唯一方法是调用some 。 我的问题是,获取ResultSet会占用我不必要的资源-我真的不需要查询表中的数据,我只需要一些有关表的信息。 有谁知道以任何方式获取对象而不先获取(可能来自巨大表)的对象吗? 问题答案: 也许你可以使用 它为每个表列返回一行。 在这种情况下,您将使用返回的本身,而不是其。

  • 问题内容: 在C#中,我们有和有或没有命名空间(包在Java世界中)得到一个类型(类在这种情况下)的名称。 java等于什么? 显然,有比手动使用和删除软件包名称更好的方法。 问题答案: 返回源代码中给定的基础类的简单名称。如果基础类是匿名的,则返回一个空字符串。 数组的简单名称是组件类型的简单名称,后接“ []”。特别是其组件类型为匿名的数组的简单名称为“ []”。 它实际上是从名称中删除软件包

  • 问题内容: 我的问题是,当它尝试第二次读取对象时,会引发异常: 我第一次发送完全相同的对象消息;但是,当我第二次尝试执行相同的操作时,则会在上面抛出错误。我是否需要重新初始化readObject()方法?我什至打印出了下面一行所接收到的消息对象,它与第一个可以正常工作的实例完全相同。 Object buf = myInput.readObject(); 我假设附加有一些问题,但是附加确实没有用。我

  • 我在Log4j2上开发了一个包装器类。使用OSGi的声明性服务,我发布了一个定制的记录器服务,使用我自己的记录器接口,包装器类作为实现。包装器类仅用于以编程方式配置记录器,即消息格式 我想打印日志文件中请求的每个日志的源类/文件名和行号。选项%C/%F和%L只打印有关包装器类中我实际调用log方法的位置的信息。 因此,作为一种锻炼,我每次都把新的Throwable作为参数传递,这样我就可以使用布局

  • 我试图在不生成代码的情况下使用JOOQ。我有一个像这样的刀类 一个像这样的Pojo类 当我尝试使用这样的主方法从表中读取时 我可以看到SQL查询运行良好,列出了所有匹配的行,但pojo返回的是null值。我做错了什么?谁能给我指一下正确的方向吗?我真的很感激任何帮助。