Java FileChannel.force()和StandardOpenOption.Sync之间有什么区别?

时间:2011-09-06 23:29:20

标签: java file-io filesystems nio

我不确定新的Java 7 nio.file.StandardOpenOption是否与旧的FileChannel.force()方法不同。

还有办法做O_DIRECT吗?

2 个答案:

答案 0 :(得分:0)

我认为两者之间的区别在于StandardOpenOption会自动执行此操作,而您必须调用FileChannel.force()将数据发送到底层存储设备。我不确定O_DIRECT。

答案 1 :(得分:0)

使用JVM无法执行O_DIRECT IO。其中一个原因(我认为)是,文件内容需要与大约512字节边界对齐的内存。分配有ByteBuffers的内存不符合此属性。

与此512字节对齐类似的另一个问题是您只能执行512字节倍数的IO操作。因此,如果你想读取一个有700字节的文件,你就会遇到麻烦。

Here is a similar thread that presents these issues. 我描述了一种方式in my blog how to implement direct IO into the JVM。它还包含一个提示,您可以如何向StandardOpenOption类添加O_DIRECT选项(您必须将常量添加到JDK源中的文件/src/solaris/native/sun/nio/fs/genUnixConstants.c