首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >附加到ObjectOutputStream

附加到ObjectOutputStream
EN

Stack Overflow用户
提问于 2009-07-28 14:51:03
回答 6查看 64.9K关注 0票数 61

是否不能附加到ObjectOutputStream

我正在尝试附加到对象列表中。下面的代码片段是一个函数,每当作业完成时都会调用该函数。

代码语言:javascript
复制
FileOutputStream fos = new FileOutputStream
           (preferences.getAppDataLocation() + "history" , true);
ObjectOutputStream out = new ObjectOutputStream(fos);

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

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

为了阅读,我正在使用

代码语言:javascript
复制
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() );
}

我不知道有多少对象会出现,所以我边读边看,没有例外。根据谷歌的说法,这是不可能的。我想知道有没有人知道怎么做?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-28 15:58:07

诀窍如下:子类化ObjectOutputStream并覆盖writeStreamHeader方法:

代码语言:javascript
复制
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表明,在某些情况下,将writeStreamHeader覆盖为no-op的原始版本可能会创建无法读取的流之后,添加了对reset()的调用。

票数 81
EN

Stack Overflow用户

发布于 2009-07-28 15:18:36

正如API所说,ObjectOutputStream构造函数将序列化流头写入基础流。并且这个头应该只出现一次,在文件的开头。所以打电话给

代码语言:javascript
复制
new ObjectOutputStream(fos);

FileOutputStream上多次引用同一文件将多次写入标头并损坏文件。

票数 16
EN

Stack Overflow用户

发布于 2009-07-28 15:13:46

由于序列化文件的精确格式,追加确实会破坏它。您必须将所有对象作为同一个流的一部分写入文件,否则当它读取流元数据时,当它需要一个对象时,它将崩溃。

你可以阅读Serialization Specification以了解更多细节,或者(更容易)阅读this thread,其中Roedy Green基本上说了我刚才说的话。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1194656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档