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