我不確定新的Java 7 nio.file.StandardOpenOption是否與舊的FileChannel.force()方法不同。Java FileChannel.force()和StandardOpenOption.Sync之間的區別是什麼?
有沒有辦法做O_DIRECT呢?
我不確定新的Java 7 nio.file.StandardOpenOption是否與舊的FileChannel.force()方法不同。Java FileChannel.force()和StandardOpenOption.Sync之間的區別是什麼?
有沒有辦法做O_DIRECT呢?
我認爲兩者之間的區別在於StandardOpenOption
會自動執行此操作,而您必須致電FileChannel.force()
將數據發送到底層存儲設備。我不確定O_DIRECT。
使用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
)