Tim Brayの記事"Saving Data Safely"は未解決の質問を残しました。今日は1ヵ月以上経過しており、フォローアップは見られませんでしたので、ここで話題に取り組むことにしました。Android(Java)のext4/fsyncの状況が不明確
FileOutputStreamを使用する場合、FileDescriptor.sync()を呼び出して安全な側に置く必要があります。最初は、私はJavaを行う12年の間に同期するJavaコードを見たことがないので、私は非常に苛立っていました。特にファイルに対処するのはかなり基本的なことです。また、FileOutputStreamの標準JavaDocは同期時にヒントされませんでした(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(); }
私はflush()がすべてがディスクに書き込まれていることを確認することを期待していました - 本質的にsync()を呼び出すことによって。そうじゃないの? –
@a_horse_with_no_name:いいえ、そうではありません。 _flush_と_sync_は、2つの異なる操作です:フラッシュは単に中間バッファをフラッシュします。 syncは実際にストレージに書き込みます。例えば、 http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync – sleske
@sleske:明確化のおかげで! –