try-with-resources 中的 ObjectOutputStream
ObjectOutputStream in try-with-resources
我正在使用 ObjectOutputStream
将数据写入文件。以下是代码片段。
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)))
{
oos.writeObject(allObjects);
}
问题:
- 是否需要在try-with-resources中将OOS和FOS的对象构造分开?我假设 OOS 在内部也会关闭 FOS。所以上面的代码行应该没问题。
- 我需要显式调用 flush 吗?
问题是我在文件损坏后看到的问题,在调试时我遇到了上述问题。
否:
关闭 ObjectOutputStream 会自动关闭 FileOutputStream
否:
流将在关闭时自动刷新。
我认为开发商应该以公布的总合同为准。
没有证据表明 ObjectOutputStream
的 close()
方法调用了 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?
}
我正在使用 ObjectOutputStream
将数据写入文件。以下是代码片段。
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)))
{
oos.writeObject(allObjects);
}
问题:
- 是否需要在try-with-resources中将OOS和FOS的对象构造分开?我假设 OOS 在内部也会关闭 FOS。所以上面的代码行应该没问题。
- 我需要显式调用 flush 吗?
问题是我在文件损坏后看到的问题,在调试时我遇到了上述问题。
否: 关闭 ObjectOutputStream 会自动关闭 FileOutputStream
否: 流将在关闭时自动刷新。
我认为开发商应该以公布的总合同为准。
没有证据表明 ObjectOutputStream
的 close()
方法调用了 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?
}