InputStreamが開いたままにした場合でも、私はInputStreamReaderのを閉じる必要がありますか?

entreprenr:

InputStreamそれはさらに処理して、閉じられますどこかからパラメータとして渡されます。だから私は、クローズしたくないInputStreamここに。次のコードを考えてみます。

void readInputStream(final InputStream inputStream) {
    final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    while ((line = bufferedReader.readLine() != null) {
        // do my thing
    }
}

私が閉じている場合BufferedReader、および/またはInputStreamReader、その根底にはInputStream、別のStackOverflowのポストによると、同様に閉じられます。

私の質問:実行(Do)読者が基本となるがあっても、クローズする必要がInputStreamどこか閉じていますか?私は読者を閉じていないことにより、メモリリークを取得することはできますか?

スティーブンC:

読者が根底にあっても、クローズする必要がありますかInputStreamどこか閉じていますか?

彼らは絶対にそのシナリオにする必要はありませんありません。しかし、とにかくそれを閉じるために、一般的には良いアイデアです。

私は読者を閉じていないことにより、メモリリークを取得することはできますか?

いや、と仮定して、メモリリークはありませんReaderあなたはそれを終えた後、それ自体が到達不能になりました。それに、Reader一般的に多くのメモリを使用していません。

もっと重要な問題は、あなたが得ることができるかどうかであるリソース閉じないでリークをReader答えは...それは依存しています。

  • あなたは基礎となることを保証することができる場合InputStream、常にアプリケーションのどこか閉鎖される、そしてそれは可能性メモリリークの世話をします。

  • あなたがそれを保証することはできません場合は、リソースリークの危険性があります。基礎となるOSレベルのファイルディスクリプタは、(例えば)Linuxでの限られたリソースです。JVMは、それらを閉じていない場合は、彼らが出て実行することができますし、特定のシステムコールが予期せずに失敗を開始します。

あなたがいる場合でも、やる近いReader、その後基礎となるがInputStream します閉じられること。

呼び出しclose()以上に何度もInputStream無害であり、そしてほとんど何も費用はかかりません。

あなたが唯一のケースすべきではないに近いReader、根本的に閉じることが間違っているだろうというときですInputStreamたとえば、あなたが閉じた場合にSocketInputStreamアプリケーションの残りの部分は、ネットワーク接続を再確立することができないかもしれません。同様に、InputStream関連付けられたSystem.in通常再度開くことができません。

その場合には、できるように、実際に安全であるReaderあなたはゴミを収集するためにあなたの方法で作成します。異なりInputStream、一般的なReaderクラスがオーバーライドしないObject::finalize()データのソースを閉じます。


@Pshemoシステム設計に関する重要なポイントを育てました。

あなたが受け入れている場合はInputStream、引数として、ローカルでそれをラップする間違っている可能性がありReader、特に... BufferedReaderAはBufferedReader、ストリーム上の先読みするおそれがあります。ストリームは、発信者によって使用されようとしている場合は後にあなたの方法に戻り、その後、バッファに読み込まれますが、この方法で消費されないされたすべてのデータが失われやすくなります。

良いアイデアは、合格するために、発信者のためになりますReaderまた、この方法は、として文書化する必要があります所有権服用のをInputStreamその場合、それはすべき常にclose()それ。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=119908&siteId=1