【问题标题】:Java ObjectOutputStream and updating a fileJava ObjectOutputStream 和更新文件
【发布时间】:2012-01-12 06:10:03
【问题描述】:

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

当我想向列表中添加一些元素时会出现问题。在我的文件的开头,我有一个 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

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

【问题讨论】:

    标签: java objectoutputstream


    【解决方案1】:

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

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

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

    【讨论】:

    • 我只是在找不到其他解决方案的情况下才考虑重写整个文件,所以没有办法更新我的文件的第一个条目?
    • 感谢您的建议,现在我选择了一个文件 - 一个条目,我会看看它是否会成功,如果没有,我会将我的实现更改为一个文件并重写。
    • 要重写整个文件,这实质上是否意味着将其所有数据反序列化为 ArrayList,对此类数据执行所需的修改,删除文件,然后将 ArrayList 的内容写入旧文件名的新创建文件?
    猜你喜欢
    • 2013-05-02
    • 2015-05-02
    • 2012-02-03
    • 2011-06-17
    • 2012-08-08
    • 2012-05-29
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多