附加到ObjectOutputStream(写入没有关闭流的多个对象)

时间:2011-07-05 06:59:44

标签: java serialization objectoutputstream

Desclaimer我的问题与以下两个链接不同

Question 1

Question 2

    public class AppendableObjectOutputStream extends ObjectOutputStream {
      public AppendableObjectOutputStream(OutputStream out) throws IOException {
        super(out);
      }

      @Override
      protected void writeStreamHeader() throws IOException {}
}
  • 上述解决方案的问题在于它们不支持将多个对象写入可附加流而不关闭流。
  • 如果我打开可附加流,写多个对象 - 那么在阅读时我只能正确读取第一个对象,并且在尝试读取第二个对象时,我会得到EOF异常。
  • 如果我按照将对象写入可附加流的方式,关闭流。然后再打开流,写另一个对象关闭等等。这样我就能正确读取多个对象。

        fileOutputStream = new FileOutputStream("abc.dat",true);
         outputBuffer = new BufferedOutputStream(fileOutputStream);
         objectStream = new AppendableObjectOutputStream(outputBuffer);
         BucketUpdate b1 = new BucketUpdate("getAllProducts1",null,"1",null);
         BucketUpdate b2 = new BucketUpdate("getAllProducts2",null,"2",null);
         BucketUpdate b3 = new BucketUpdate("getAllProducts3",null,"3",null);
         objectStream.writeObject(b1);
         objectStream.writeObject(b2);
         objectStream.writeObject(b3);
         objectStream.close();
    

2 个答案:

答案 0 :(得分:4)

在编写每个对象后调用ObjectOutputStream.reset()将解决此问题。

答案 1 :(得分:3)

如果您检查问题mentioned,您将看到如果文件已包含某些对象,则必须仅使用AppendableObjectOutputStream 附加对象进行归档。对于空文件,您必须使用普通ObjectOutputStream,因为在这种情况下标题应写入开头。