【问题标题】:Reading an object file written by ObjectOutputStream in append mode (multiple closings)以追加模式读取由 ObjectOutputStream 写入的目标文件(多次关闭)
【发布时间】:2014-09-22 10:31:09
【问题描述】:

在过去 2 周内,我在同一个文件中写入了多个对象。每次(可能是百万次)我都会调用:

try(ObjectOutputStream output=new ObjectOutputStream(new FileOutputStream(new File("somefile"),true))) {            
        output.writeObject(someobject);               
        output.close();
    } 

现在当我尝试使用以下方法阅读它时:

try(ObjectInputStream input=new ObjectInputStream(new FileInputStream(new File("somefile")))) {   
        while(true) {     
            PROCESS_IT(input.readObject());
        }
    }

它只读取第一个对象并给出错误:

java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

我现在知道我应该在编写这些对象时覆盖流标头 (Appending to an ObjectOutputStream)

但我花了 两周 才得到这个“somefile”中的结果。 我可以通过跳过损坏的字节/标头以某种方式读取所有对象吗? 请指教。谢谢

【问题讨论】:

    标签: java objectinputstream objectoutputstream


    【解决方案1】:

    我还没有(还)测试过它,但是你应该能够每次在同一个 FileInputStream 上重新创建 ObjectInputStream 并且它会重新读取标题。

    例如(同样,未经测试):

    FileInputStream fis = new FileInputStream("someFile");
    while (true) {
      ObjectInputStream input = new ObjectInputStream(fis)
      try {
        PROCESS_IT(input.readObject());
      }
      // Don't close the DataInputStream, it would close the underlying FileInputStream
    }
    

    理论上应该是,当你创建ObjectInputStream时,它会读取header,然后读取一个对象,推进底层的FileInputStream。然后,当您迭代并创建第二个 ObjectInputStream 时,它不知道底层 FileInputStream 已被部分消耗,因此将重新读取标头并读取另一个对象。以此类推。

    【讨论】:

    • 我测试过。但它仍然只读取第一个对象并给出“java.io.IOException:Stream Closed”错误几次。
    • 您可能不必关闭ObjectInputStream
    • 没有。那肯定行不通。 try 将关闭 input 将关闭 fis
    • 是的,现在我尝试不使用“try”语句并且似乎可以正常工作。非常感谢。让我免于额外的麻烦。
    • 哦,是的,我忘记了 try->close->close 的事情,这就是为什么我指定代码未经测试,但只是为了说明它是如何工作的。现在修改了答案以指定 ObjectInputStream 不能关闭。
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 2011-06-14
    • 2016-10-21
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    相关资源
    最近更新 更多