我不确定新的Java 7 nio.file.StandardOpenOption是否与旧的FileChannel.force()方法不同。
还有办法做O_DIRECT吗?
答案 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
)