2009-07-02 7 views
2

Я использую RandomAccessFile для выполнения некоторых операций записи в файл как часть транзакции. Прежде чем совершить транзакцию, я хочу быть абсолютно уверенным, что данные записываются на диск. Вызов force(boolean) на RAF FileChannel, как представляется, предоставляет эту гарантию, но называется ли он неявным, когда я закрываю файл, или мне нужно называть его вручную?Производит ли RandomAccessFile.close() внутреннее вызов FileChannel.force()?

Кроме того, имеет ли кто-нибудь представление о том, что на самом деле делает force(), и насколько ему можно доверять? Возможно ли, что ОС может сообщить, что данные были записаны на диск, когда на самом деле он все еще находится в каком-то кеше? В какой степени это зависит от ОС/HDD/файловой системы?

ответ

0

Это полностью зависит от FS. Но если вы не получаете исключение (IO), вы должны доверять JVM и совершать транзакции. Можете ли вы доверять своему FS, это другой вопрос. Например, если вы используете ext4 с включенным задержанным распределением, вы можете потерять данные при мгновенной потери мощности даже после того, как функция RandomAccessFile # force (boolean) вернется успешно. JVM полагается на FS-API вашей операционной системы и не заботится о фактической реализации и конфигурации.

И да, перед закрытием вы должны вызвать RandomAccessFile # force (boolean). Является ли #close вызывает #force до реализации FileChannel.