Как напрямую читать/записывать файл с и на устройство (например, эффект O_DIRECT-флага) на Java-пути?

Мне нужно читать/писать файлы напрямую, без какой-либо буферизации. В старой версии C я сделал это, используя открытый метод с флагом O_DIRECT.

Возможно ли это на Java?

Здесь O_DIRECT description

Попробуйте минимизировать кеш-эффекты ввода-вывода в и из этого файла. В               В общем, это ухудшит производительность, но полезно в специальных               ситуации, например, когда приложения выполняют собственное кэширование. Файловый ввод-вывод               выполняется непосредственно в/из буферов пользовательского пространства.

ОБНОВЛЕНО:

Здесь мой пример кода,

// write
fos = new FileOutputStream(fileName);
fos.write(inputData);
fos.flush();
fos.close();

// read
fis = new FileInputStream(fileName);
int len = fis.read(outputData, offset, length);
fis.close();

Фон состоял в том, что я написал данные (фактически, команду) файлу на SD-карте (какая-то смарт-карта), затем смарт-карта получила команду и подготовил результат к тому же файлу. Обычно я могу просто прочитать данные (результат) из этого файла, но я получил те же inputData и outputData, а именно, я только что получил свою команду. Этот неожиданный результат. Я подозреваю, что код просто писал/читал в буфер и из него, а не в настоящий файл. Flush не работал.

Ответы

Ответ 1

В файлах android для FileOutputStream явно указано, что это небуферизованный поток. Несмотря на это, flush(), за которым следует close(), должен делать трюк. Единственный дополнительный шаг, который вы можете предпринять, прежде чем close() будет getFD(). Sync().

Вы упомянули смарт-карту, поэтому это устройство реализует свою собственную (фальшивую) файловую систему, отображаемую как SD-карта или таковая для хоста. Планирует ли карта, как долго вы должны давать карточке уведомление об изменениях в файле? На уровне ввода-вывода блока нет соответствующей операции "открыть" или "закрыть", поэтому устройство должно заметить запись байтов.

Альтернативно, если устройство "умное" и использует изменения во времени в метаданных файла, вам может потребоваться вызвать File.setLastModified(System.currentTimeMillis()), чтобы "коснуться" файла вручную. Предполагая, что устройство sd-типа смонтировано с возможностью "noatime" для повышения производительности.

Ответ 2

Когда вы вызываете close(), все данные, связанные с файловым дескриптором, исчезают. Поскольку вы получаете одинаковые входные данные в качестве выходных данных, это может быть не проблема чтения файлов Java.

Я предлагаю вам отладить ваше устройство (драйвер) от Linux, а не от Android. Если вы предпочитаете, напишите программу C, чтобы сделать то же самое, и попробуйте запустить ее из оболочки adb. Это должно помочь вам разобраться в исходной проблеме.