Тим Брей статья "Сохранение данных безопасно" оставила мне открытые вопросы. Сегодня, это в течение месяца, и я не видел никаких последующих действий, поэтому я решил обратиться к этой теме здесь.
Одна из целей статьи заключается в том, что FileDescriptor.sync() следует вызывать, чтобы быть в безопасности при использовании FileOutputStream. Сначала я был очень раздражен, потому что я никогда не видел, чтобы какой-либо Java-код выполнял синхронизацию в течение 12 лет, когда я занимаюсь Java. Тем более, что справляться с файлами - довольно простая вещь. Кроме того, стандартный JavaDoc FileOutputStream никогда не намекал на синхронизацию (Java 1.0 - 6). После некоторых исследований я решил, что ext4 может быть первой основной файловой системой, требующей синхронизации. (Существуют ли другие файловые системы, в которых рекомендуется явная синхронизация?)
Я ценю некоторые общие мысли по этому вопросу, но у меня также есть некоторые конкретные вопросы:
- Когда Android выполнит синхронизацию с файловой системой? Это может быть периодическим и дополнительно основано на событиях жизненного цикла (например, процесс приложения переходит в фоновый режим).
- Помогает ли FileDescriptor.sync() синхронизировать метаданные? Это синхронизация каталога измененного файла. Сравните с FileChannel.force().
- Обычно, файл напрямую не записывается в FileOutputStream. Здесь мое решение (вы согласны?):
FileOutputStream fileOut = ctx.openFileOutput(file, Context.MODE_PRIVATE); BufferedOutputStream out = new BufferedOutputStream(fileOut); try { out.write(something); out.flush(); fileOut.getFD().sync(); } finally { out.close(); }