try-with-resources 中的 ObjectOutputStream

ObjectOutputStream in try-with-resources

我正在使用 ObjectOutputStream 将数据写入文件。以下是代码片段。

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f))) 
{
    oos.writeObject(allObjects);
}

问题:

  1. 是否需要在try-with-resources中将OOS和FOS的对象构造分开?我假设 OOS 在内部也会关闭 FOS。所以上面的代码行应该没问题。
  2. 我需要显式调用 flush 吗?

问题是我在文件损坏后看到的问题,在调试时我遇到了上述问题。

  1. 否: 关闭 ObjectOutputStream 会自动关闭 FileOutputStream

  2. 否: 流将在关闭时自动刷新。

我认为开发商应该以公布的总合同为准。

没有证据表明 ObjectOutputStreamclose() 方法调用了 flush()

我相信 OpenJDK 的 ObjectOutputStream#close 只是一个供应商实现。

如果我们在 try-with-resources 上刷新也不会造成伤害。

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f))) {
    oos.writeObject(allObjects);
    oos.flush(); // What's possibly going wrong with this?
}