Вызывает ли RandomAccessFile.close() внутренний вызов FileChannel.force()?
-
21-08-2019 - |
Вопрос
Я использую RandomAccessFile для выполнения некоторых операций записи в файл в рамках транзакции.Прежде чем зафиксировать транзакцию, я хочу быть абсолютно уверен, что данные записаны на диск.Вызов force(boolean)
на РАФ FileChannel
похоже, предоставляет эту гарантию, но вызывается ли она неявно, когда я закрываю файл, или мне придется вызывать ее вручную?
Кроме того, есть ли у кого-нибудь понимание того, что force()
на самом деле так и есть, и насколько этому можно доверять?Возможно ли, что ОС может сообщить, что данные записаны на диск, хотя на самом деле они все еще находятся где-то в кеше?В какой степени эта ОС/жесткий диск/файловая система зависит?
Решение
Это полностью зависит от FS.Но если вы не получили исключение (IO)Exception, вам следует довериться JVM и зафиксировать транзакцию.Другой вопрос, можете ли вы доверять своему FS.Например, если вы используете ext4 с активированным отложенным выделением, вы можете потерять данные при мгновенном отключении питания даже после успешного возврата RandomAccessFile#force(boolean).JVM полагается на FS-API вашей операционной системы и не заботится о фактической реализации и настройке.
И да, перед закрытием вам нужно вызвать RandomAccessFile#force(boolean).Будет ли #close вызывать #force, зависит от реализации FileChannel.