当前位置: 首页 > 面试题库 >

追加到ObjectOutputStream

辛龙野
2023-03-14
问题内容

无法附加到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();
  }

}

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

编辑

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

编辑

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

编辑

reset()在此问题之后添加了一个调用,以表明原来的版本writeStreamHeader在某些情况下可以改写为无操作,这会创建无法读取的流。



 类似资料:
  • 问题内容: 我正在编写一个包含10个存储桶列表的简单哈希表。使用内置函数计算索引,然后对表大小取模。但是,当我尝试将对象附加到该索引的存储桶列表时,它会附加到每个存储桶列表。我尝试用不同的方式定义add_HT,但我一直得到相同的结果。我究竟做错了什么? 问题答案: 使指向 同一列表 的指针数量增加。这里不是问题。您需要定义为。

  • 问题内容: 嘿,我需要附加到我的文件中,但是它不起作用,它会不断覆盖文件,任何人都可以告诉我出什么问题了: 提前致谢。 问题答案: 您可以通过更改分配以下内容的行来解决此问题: 使用仅包含的构造函数打开文件时,它将覆盖文件中先前的内容。如果提供第二个参数,则表示您要附加到第二个参数的末尾。

  • 问题内容: 我提出了有关添加带有WITH索引的行的问题,但是我还不清楚在没有索引的情况下这是为什么/为什么发生: 我希望这里有2X4数据帧。但是,没有添加任何值,也没有发生错误。 为什么不添加系列,为什么不出现任何错误? 如果我尝试使用LOC添加行,则会添加索引, 结果: 我猜LOC和iLOC都不能用于添加没有索引名称的行(即Loc添加索引名称NaN,并且当索引号高于数据库行时不能使用iLoc)

  • 问题内容: 我用谷歌搜索了一段时间,但似乎找不到它,这应该很容易。我想将CR添加到使用Transformer创建的XML文件的末尾。有没有办法做到这一点> 我尝试了以下操作,但这导致空白文件? 问题答案: 简单…只需添加append选项:

  • 我有2个配置文件,可以或不可以一起使用来运行一组测试。它们都需要不同的VMARG来运行,但是如果它们一起使用,可以将它们附加到彼此之间。 我正在寻找的是一种将argLine设置为其当前值加上我设置的值的串联的方法。 在配置文件的每个可靠配置中,我将设置为: 这在逻辑上适合我,但它的评估方式显然不符合要求。

  • 我有一个for循环,它遍历CSV中的每一行,我创建了一个包含列表的字典,但是列表被重写了,因为字典键被重复了几次。我如何总结或追加到列表中的第二(1)位置相同的键的下一个值下一个循环迭代? 因为使用append时,如果再次找到现有键,则会覆盖该值,因此该键的值会被一次又一次地覆盖。 CSV中的字段包括: 输出应该是这样的: