0

我在解决一个实现问题时遇到了麻烦,我有一个类,它的行为类似于列表,但不是在某个集合中保存文件,而是将它们保存在磁盘上。

当我想向列表中添加一些元素时会出现问题。在我的文件的开头,我有一个 int 告诉我列表中有多少对象,但我无法找出更新这个值的优雅方法。我有这样的事情:

   public boolean add(T element)
{
    try 
    {
        out.writeObject(element);
        out.flush();
        //and here we need to update the int in my file
    } catch (IOException e) 
    {
        e.printStackTrace();
    } 
    return true;
}

我试图使用这样的东西:

ObjectOutputStream upd=new ObjectOutputStream(new FileOutputStream(data.getAbsolutePath(),true));

但是正如我观察到的那样,它会将一些数据写入文件的开头,一些序列化标头或某事,我如何更新文件中的单个条目或如何更改

ObjectOutputStream

“指针”写在文件的开头?

4

1 回答 1

2

通常对于基于流的类(尤其是像 OOS 这样的高阶流),您应该在更新整个文件时重写整个文件。

如果您真的坚持只更新文件的一部分,那么您应该将文件视为由 N 个流组成,其中每个“流”代表您正在编写的一个对象。所以我会使用 RandomAccessFile 作为基本文件,然后当我想写一个对象时,我会在 ByteArrayOutputStream 上包装一个 ObjectOutputStream,将你的对象写入其中,然后获取这些字节,并将这些字节重写到 RandomAcessFile 中你要。

这可能不会特别有效,因为您将为您正在编写的对象编写 N OOS 标头和 N 类描述。

于 2011-12-03T17:23:21.770 回答