是否需要FileChannel.force和FileDescriptor.sync?

在https://stackoverflow.com/questions/730521/really-force-file-sync-flush-in-java中 ,作者在答案摘要中写道:

对于Java NIO,使用c.force(true),然后使用s.getFD()。sync()

我的问题是:你真的需要两者吗? 力不够吗? 是不是强制和同步只是不同的接口做同样的事情? 我找不到任何确认的地方。

我的理解是,正确答案是否定的。

FileChannel .force调用fdatasync或fsync 。 这可以在OpenJDK源代码的jdk / src / solaris / native / sun / nio / ch / FileChannelImpl.c中看到。 FileDescriptor调用fsync(要发现它更复杂。我最终将其追溯到jvm.cpp)。

我是相关问题的“作者”。 所以我错了。 FileOutputStream.flush是不够的。 因为它是无操作的。 因此,您需要强制或同步。