質問: StandardOpenOption.SYNCとStandardOpenOption.DSYNC 1. StandardOpenOptionとの違いは何ですか? .SYNC および StandardOpenOptionを参照してください。 DSYNC ? 2. DSYNCでどのようなデータ損失が発生する可能性がありますか? 3. DSYNCはどのユースケースに適していますか?既にファイルの内容を同期することを決めた場合、ファイルのメタデータの同期を忘れることをお勧めしますか?オーバーヘッドの相対的な差は無視できないでしょうか?
回答: ギリ、 DSYNCはSYNCのサブセットです。 SYNCでは、DSYNCがファイル・データだけを同期して書き出す必要がある間に、すべてのデータ(ファイル・システムによって管理されるファイル・データおよびファイル・メタデータ)が同期的に書き出されることが必要です。オーバーヘッドに関しては、私はそれが "ファイルシステムに依存する"巨大だと思う。コピーオンライト、シャドウコピー、バージョニング、チェックサムなどのコンセプトを使って、最新のファイルシステムを見てみましょう。私は、すべての作業が完了するまで、書き込み操作全体をブロックしてブロックすることはコストがかかると考えています。 データ損失の可能性は、提供するためのより混乱した答えです。非同期ファイルI/Oの利点は、基礎となるファイルシステムまたはディスクが実際にバッチまたは順序付け書き込みを行い、ランダムI/Oを回避し、書き込みをより逐次的に構造化できることです。 それは素晴らしいですが、あなたのデータ損失の問題に答えるために、潜在的に失われる可能性があるフラッシュの前にキャッシュに座っているペンディング書き込みがあります。要するに、言うことは難しい。 つまり、順序は次のようになります。 1. (オプションなし) - まだフラッシュされていない1つ以上の保留中の書き込みから、ファイルデータとファイルメタが損失する可能性が最も高い。 2. DSYNC - 遅く、ファイルデータが書き込まれ、返されるまで待ちます(後でファイルメタを保存します)。 3. SYNC - 最も遅く、ファイルデータとファイルメタが書き出されるまで待ってから、戻る前にサムをアップします。 私は、これらすべての質問が新しい AsynchronousFileChannel (Java 7の場合);それが事実でないなら私の謝罪。