File.createTempFile создать специальный файл или как принудительно сбросить данные на жесткий диск? - PullRequest
0 голосов
/ 26 августа 2010

Я использую File.createTempFile для создания обычных файлов, которые я хочу сохранить, поэтому я использую этот метод, потому что он гарантирует уникальное имя файла. Однако я вижу странную вещь с файлами, созданными этим методом: после того, как я очищаю и закрываю поток вывода для этого файла, я намеренно аварийно завершаю работу машины, на которой выполняется JVM, я предположил, что поскольку поток очищается и закрывается, файл должен содержать действительный данные. Однако иногда вместо этого файл заполняется 0x0 (обратите внимание, что я тестирую это на коробке VMWare с WinXP и последней Sun JVM 1.6).

Проблема вызвана временным файлом или это какая-то общая проблема, которая относится ко всем файлам Java io? Что я должен сделать, чтобы обеспечить сброс данных на жесткий диск?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 августа 2010

В дополнение к flush() попробуйте позвонить output.getFileDescriptor().sync() на FileOutputStream.

0 голосов
/ 26 августа 2010

Большинство современных файловых систем обращаются к такой проблеме - см. о журналировании файловой системы для быстрого ознакомления с проблемой.

Суть в том, что в случае сбоя системы недавно обновленные файлы могут вернуться к предыдущим данным. Если вы недавно создали файл, он может быть заполнен нулями.

В UNIX вы предотвращаете это, используя fsync и / или fdatasync. Я не Windows, но это может быть отправной точкой: кроссплатформенный fsync () . Я не уверен, как это сделать с Java.

...