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

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

}

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



 类似资料:
  • 如何将数据附加到文件的末尾(或开头)?我试着用 但它只写最后一项。

  • 问题内容: 在春季,您可以XML配置一个bean以具有一个限定符。如果通过Java批注配置Bean,我似乎找不到如何附加限定符。那是怎么回事?我是否必须仅使用简单的旧名称? 问题答案: 如果您使用的是注释(不是基于Java的配置),则可以使用以下内容添加限定符(请参见Spring文档): 并使用以下命令连接bean(同样,请参见Spring文档):

  • 问题内容: 我已经创建了两个XML文档,并且想将这两个文档合并到一个新的信封中。所以我有 和 我想做的是将两个节点合并到一个根节点中: 合并的文档 我尝试创建一个临时文档,并用文档的根节点替换子级: 我当时希望用两个文档的根元素替换两个空格,但我得到“ WRONG_DOCUMENT_ERR:一个节点在与创建它的文档不同的文档中使用”。我尝试采用和导入根节点,但是遇到相同的错误。 是否有一些简便的方

  • 我有一个程序,它总是将相同的文件附加到GMAIL(撰写 它所做的是: 在Android 6.0之前,它一直工作良好。现在,我在尝试使用它时收到以下错误: 无法附加空文件 Astro文件共享给我同样的错误(可能是旧版本)。 但是,我安装了ES File Explorer,当我执行相同的例程并选择该文件时,我会收到一个对话框,其中显示: 将文件作为 普通Android方式(适用于彩信、Gmail等)

  • 问题内容: 我正在写某种生成加密日志文件的记录器。不幸的是,密码学不是我的强项。现在,我可以向文件写入几条消息,然后关闭文件。然后我可以打开它,附加一些消息,再次关闭,解密后,我在文件中间看到填充字节。有什么方法可以处理加密文件,而不必每次我想添加一些消息时都对其解密? 编辑 :更多细节。当前实现使用CipherOutputStream。据我了解,没有办法 寻求 使用它。如果我将控制输出数据大小可