2016-03-22 5 views
0

パフォーマンスを向上させるために操作をバッファするライブラリがあります。呼び出し側は、flush()メソッドを呼び出して、強制的に操作を開始することができます。操作が完了するまでブロックするFlushable.flush()の一般的な動作はありますか?

しかし今のところ、flush()メソッドは、非同期的に操作を開始するように実装されています。

つまり、呼び出し元がflush()メソッドを呼び出すと、別のスレッドで操作が開始され、flush()メソッドが返されます。

このようにして、呼び出し元は、操作が完了したかどうか(操作の結果を確認することで検出する必要があるかどうか)、またはclose()メソッドを呼び出す前に知りません。

すべての操作が完了するまでflush()呼び出しブロックを修正することで修正したいと考えました。

これを行う前に、flush()メソッドをブロックする必要があります。しかし、APIドキュメントではそうした契約は明記されていません。

Flushable.flush() API Doc:

をフラッシュ基本となるストリームにバッファされた出力を書き込むことで、このストリーム。

OutputStream.flush() API Doc:

この出力ストリームをフラッシュし、バッファ出力バイトを強制的に が出て書き込まれます。 flushの一般的な規約は、先に書き込まれた任意のバイトが によってバッファリングされていれば、そのようなバイトは直ちに が意図された宛先に書き込まれなければならないことを示しています。このストリームの意図した宛先が、その後、書き込み用のオペレーティング・システムに渡される前にストリーム に書き込まれたバイトのみ ストリームの保証をフラッシュする基礎となるオペレーティング・システムによって提供さ 抽象化、例えばファイルがある場合、

;ディスク ドライブなどの物理デバイスに実際に書き込まれることを保証するものではありません( )。

OutputStreamのflushメソッドは何もしません。

いずれのドキュメントも、出力が書き込まれるまでブロッキングについて何も指定しません。

flush()の一般的な理解は、ブロッキングコールである必要はありませんか?

+0

太字でテーパーを付けてください。それはちょうどノイズです。それは何も追加せず、読みやすさを妨げます。 – EJP

+1

'OutputStream.flush()'は、データを物理的に保存することを保証しないため、それらが基本のストリームに書き込まれることを保証し、ブロックすることなく保証を与えることはできません。通常は 'flush()'はブロックされるので、IMOを使用すると、ほとんどのプログラマがAPIを期待通りに実行できます。 –

答えて

2

APIドキュメントでは、このような契約が指定されていません。

はいです。

両方のJavadocの見積もりは、本来すべての操作でブロックされているOutputStreamファミリのものです。非同期に行うと、ストリームに書き込まれたバイトがフラッシュされることを保証できません。

解決策:しないでください。

+0

私は "解決策:できません"と願っています。あなたは非同期的にflush()をしないことを意図していました。 – Codebender

+0

@コードベンダーが正しい。 – EJP

関連する問題