ObjectOutputstream覆盖旧对象而不关闭流

时间:2017-01-30 22:16:24

标签: java objectoutputstream

我想要实现的目标:当我使用writeObject()类中的ObjectOutputstream方法将Integer对象保存到文件时,我想覆盖旧的Integer对象并将其替换为新的对象。但是每次我想要放置一个新的Integer对象时,我都不想关闭并重新打开流。我只想用新值更新它。

我提出的解决方案并不适用于我。这是代码:

ObjectOutputStream stream1 = new ObjectOutputStream(new FileOutputStream(new File("ClientBase"), false));

stream1.writeObject(new Integer(2));

stream1.flush();
stream1.reset();

stream1.writeObject(new Integer(9));
stream1.close();

当我读到这个时,我有两个Integer对象而不是一个Integer,其值为9,被Integer替换为值为2。

如果我这样说,它就可以了。

ObjectOutputStream stream1 = new ObjectOutputStream(new FileOutputStream(new File("ClientBase"), false));

stream1.writeObject(new Integer(2));
stream1.close();    

stream1 = new ObjectOutputStream(new FileOutputStream(newFile("ClientBase"), false));

stream1.writeObject(new Integer(9));
stream1.close();

我的问题:我是否以错误的方式使用reset()方法,是否有其他方法可以在不关闭/打开流的情况下实现覆盖?

1 个答案:

答案 0 :(得分:-1)

这就是我的尝试。

但请注意,我不确定此代码是否安全......:

public static void main(String[] args) {
    try (FileOutputStream fos = new FileOutputStream("objects.file");
            ObjectOutputStream os = new ObjectOutputStream(fos)) {
        long position = fos.getChannel().position();
        os.writeObject(new Integer(2));
        os.flush();
        os.reset(); // added line
        fos.getChannel().position(position);
        os.writeObject(new Integer(9));
        os.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}