В C, когда я вызываю open()
, чтобы открыть файловый дескриптор, я должен явно передать флаг O_SYNC
, чтобы гарантировать, что запись в этот файл будет сохранена на диск к моменту возврата write()
. Если я захочу, я смогу не поставьте O_SYNC
на open()
, а затем мои записи вернутся намного быстрее, потому что перед возвратом они должны будут сделать это в кэш файловой системы. Если захочу, позже я могу заставить все выдающиеся записи в этот файл записывать на диск, вызывая fsync()
, который блокируется до завершения этой операции. (Более подробная информация доступна обо всем этом в Linux man page.)запись файла в Java без семантики O_SYNC
Есть ли способ сделать это на Java? Самое похожее на то, что я мог найти, это использовать и называть его .flush()
, но если я делаю записи в рандомизированных смещениях файлов, я считаю, что это означает, что внутренний буфер для выходного потока может в конечном итоге потреблять много памяти.
Если вы делаете записи в случайные смещения, вы не можете использовать 'BufferedOutputStream' в любом случае, потому что это последовательный. Вам нужно будет использовать что-то вроде «RandomAccessFile», но тогда я не знаю, как управлять его буферизацией (если таковой вообще есть). Вы можете посмотреть на «SeekableByteChannel», созданный с помощью [Files.newByteChannel] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newByteChannel-java.nio .file.Path-java.util.Set-java.nio.file.attribute.FileAttribute ...-), но я не использовал его, поэтому не могу дать подробный ответ. –