web-dev-qa-db-ja.com

close()の前にflush()を使用する

Java docs、Java.io Streamsでclose()を呼び出すと、自動的にflush()を呼び出します。しかし、実動コードでも、開発者は明示的にflush ()close()の直前。close()の直前にflush()を使用する必要がある条件は何ですか?

開発者は、送信する必要があるものを書き込んだ後、flush()を呼び出す習慣になります。

IMHO flush()を使用してclose()を使用するのは、書き込みが行われた直後の場合が一般的です。

// write a message
out.write(buffer, 0, size);
out.flush();

// finished
out.close();

ご覧のとおり、flush()は冗長ですが、パターンに従っていることを意味します。

28
Peter Lawrey

多くの場合、close()flush()を呼び出すことを知らないため、安全になりたいと考えています。

とにかく、バッファリングされたストリームを使用すると、手動フラッシュがほぼ冗長になります。

30
Bozho

これまでの多くのコメントが示唆している重要な概念を指摘したいと思います。

ストリームのclose()メソッドは、必ずしもそうではありませんflush()を呼び出します。

たとえば、 org.Apache.axis.utils.ByteArray #close()はflush()を呼び出しません。
(リンクをクリックしてソースコードを表示)

FlushableおよびCloseableの実装についても、より一般的に同じことが言えます。顕著な例は Java.io.PrintWriter です。そのclose()メソッドはflush()を呼び出しません。
(リンクをクリックしてソースコードを表示)

これは、開発者がストリームを閉じる前にflush()を慎重に呼び出す理由を説明するかもしれません。私は個人的に、close()を最初に呼び出さずにPrintWriterインスタンスでflush()が呼び出されるという生産上のバグに遭遇しました。

3
Fabian