В чем разница между Java FileChannel.force () и StandardOpenOption.Sync? - PullRequest
0 голосов
/ 07 сентября 2011

Я не уверен, отличается ли новый Java 7 nio.file.StandardOpenOption от старого FileChannel.force () метода.

Есть ли способ сделать O_DIRECT также?

Ответы [ 2 ]

0 голосов
/ 11 марта 2013

Невозможно выполнить O_DIRECT IO с помощью JVM. Одна из причин (я думаю) состоит в том, что память, куда помещается содержимое файла, должна быть выровнена по границам примерно в 512 байт. Память, выделенная с ByteBuffers, не выполняет это свойство.

Другая проблема, которая похожа на это выравнивание 512 байт, состоит в том, что вы можете выполнять только операции ввода-вывода, кратные 512 байтам. Поэтому, если вы хотите прочитать файл, который имеет 700 байт, у вас будут проблемы.

Вот похожая тема, в которой представлены эти проблемы. Я описал способ в своем блоге, как реализовать прямой ввод-вывод в JVM . Он также содержит подсказку, как вы можете добавить опцию O_DIRECT в класс StandardOpenOption (вы должны добавить константу в файл /src/solaris/native/sun/nio/fs/genUnixConstants.c в источниках JDK)

0 голосов
/ 07 сентября 2011

Я думаю, что разница между ними заключается в том, что StandardOpenOption делает это автоматически, в то время как вам нужно позвонить FileChannel.force(), чтобы отправить данные на базовое устройство хранения.Я не уверен насчет O_DIRECT.

...