不能附加到ObjectOutputStream吗?

我正在尝试附加到对象列表。摘录后的代码是一个在作业完成时调用的函数。

FileOutputStream fos = new FileOutputStream
           (preferences.getAppDataLocation() + "history" , true);
ObjectOutputStream out = new ObjectOutputStream(fos);

out.writeObject( new Stuff(stuff) );
out.close();


但是,当我尝试读取它时,我只会得到文件中的第一个。
然后我得到java.io.StreamCorruptedException

要阅读我正在使用

FileInputStream fis = new FileInputStream
        ( preferences.getAppDataLocation() + "history");
ObjectInputStream in = new ObjectInputStream(fis);

try{
    while(true)
        history.add((Stuff) in.readObject());
}catch( Exception e ) {
    System.out.println( e.toString() );
}


我不知道会出现多少个对象,因此我在阅读时没有例外。根据Google的说法,这是不可能的。我想知道是否有人知道吗?

最佳答案

诀窍是:子类ObjectOutputStream并覆盖writeStreamHeader方法:

public class AppendingObjectOutputStream extends ObjectOutputStream {

  public AppendingObjectOutputStream(OutputStream out) throws IOException {
    super(out);
  }

  @Override
  protected void writeStreamHeader() throws IOException {
    // do not write a header, but reset:
    // this line added after another question
    // showed a problem with the original
    reset();
  }

}


要使用它,只需检查历史文件是否存在,然后实例化此可附加流(如果文件存在=如果我们追加=我们不需要头)或原始流(如果文件不存在=实例化)我们需要一个标头)。

编辑

我对班级的第一次命名感到不满意。这样比较好:它描述的是“用途”,而不是“完成方式”

编辑

为了澄清起见,再次更改了该名称,该流仅用于附加到现有文件。它不能用于创建带有对象数据的新文件。

编辑

this question显示在某些情况下,仅将reset()改写为空操作的原始版本在某些情况下可能会创建无法读取的流,从而添加了对writeStreamHeader的调用。

关于java - append 到ObjectOutputStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47022957/

10-10 19:05