繁体   English   中英

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

[英]Reading an object file written by ObjectOutputStream in append mode (multiple closings)

在过去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)

我现在知道在编写这些对象时(应该附加到ObjectOutputStream )我应该重写流头。

但是我花了两个星期的时间才能在“ somefile”中获得结果。 我可以通过跳过损坏的字节/标头以某种方式仍然读取所有对象吗? 请指教。 谢谢

我尚未(尚未)对其进行测试,但是您应该能够每次在同一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已被部分消耗,因此将重新读取标头并读取另一个对象。 等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM