在追加模式下读取ObjectOutputStream编写的目标文件(多次关闭)

时间:2014-09-22 10:31:10

标签: java objectinputstream objectoutputstream

我在过去两周内在同一个文件中写了多个对象。每次(可能是数百万次)我打电话:

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"中得到了结果。 我可以通过跳过损坏的字节/标题以某种方式仍然读取所有对象吗? 请指教。感谢

1 个答案:

答案 0 :(得分:0)

我还没有(还)对它进行测试,但你应该能够在同一个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时,它会读取头部,然后读取一个对象,推进底层的FileInputStream。然后,当您迭代并创建第二个ObjectInputStream时,它不知道底层的FileInputStream已被部分消耗,因此将重新读取标头并读取另一个对象。等等。