web-dev-qa-db-ja.com

I / Oコンセプトのフラッシュと同期

私はこれら2つの用語に遭遇しましたが、それらに対する私の理解は互いに重なり合っているようです。フラッシュはバッファで使用され、同期はファイルのディスクへの永続的な変更について話すために使用されます。

Cでは、fflush(stdin)により、バッファーがクリアされます。そしてfsyncは変更ファイルをディスクに永続化します。

これらの概念が普遍的に定義されていない場合は、Linux、Java説明を好むでしょう。

関連する投稿を見つけましたが、irは私の質問に実際には回答しません。 Javaで本当にファイルの同期/フラッシュを強制する

35
smartnut007

Javaでは、flush()メソッドを出力ストリームとライターで使用して、バッファリングされたデータが確実に書き出されるようにします。ただし、Javadocsによると:

このストリームの目的の宛先が、基礎となるオペレーティングシステムによって提供される抽象化(ファイルなど)である場合、ストリームをフラッシュすると、以前にストリームに書き込まれたバイトがオペレーティングシステムに渡されて書き込まれることが保証されます。実際にディスクドライブなどの物理デバイスに書き込まれることを保証するものではありません。

一方、FileDescriptor.sync()を使用して、OSによってバッファリングされたデータが物理デバイス(ディスク)に確実に書き込まれるようにすることができます。これは、Linux/POSIXのsync呼び出しと同じです。

Javaアプリケーションで実際にデータが物理的にディスクに書き込まれるようにする必要がある場合、flushsyncが必要になる場合があります。例:

FileOutputStream out = new FileOutputStream(filename);

[...]

out.flush();
out.getFD().sync();

参照:

71
Grodriguez