2017-10-26 2 views
1

ストリーム(InputStreamまたはOutputStream)を作成しなかったが、パラメータとしてメソッドに渡した場合、そのストリームを閉じる必要がありますか?ここに例があります:作成していないストリームを閉じるべきですか?

void method(InputStream in) { 
    try { 
    //Do something 
    } 
    finally { 
     if(in != null) { 
     in.close(); //Is this needed and correct? 
    }  
} 
+12

いいえ、そうしないでください。 –

+0

いずれの方法でも、リソースを閉じるかどうかを* JavaDocコメント*で宣言する必要があります。 –

+0

@sdm私は間違っているかもしれませんが、 'method'を書いたのであれば、あなたのメソッドでそれを正しく使うために' InputStream'があなたのメソッドに渡される背景を知っていますか?あなたのメソッドがどのように呼び出されるかについてのアイデアがない場合、ストリームが他の場所でも使用されることを考慮すると、副作用が起こりにくいのですか? – CKing

答えて

0

私はJVMの仕様がそれについて何ら保証しないと思います。あなたは本当にこれらのリソースを最終的に閉じることになっています。

オペレーティングシステムは、メモリ、ファイルハンドル、ネットワークソケットを含むすべてのリソースを解放します。

それがコードのどこかでさらに使用することができるので、ありません、あなたがそれを行う必要はありませんがあり、開いているファイルについてチェックするためにOSの施設があり、

0

をストリーミングします。

2

実際、「それは依存します」。

一般的に、開こうとしなかったストリームを閉じずに、わかりやすく答えを伝える必要があります。

それは責任の委任がにあなたの方法を必要とすることが非常に可能ですが近いから消費ストリームを - これが事実であるならば、それはコード内で明示する必要があります。

メソッドの名前がreadFromStreamAndClose(InputStream in)の場合、メソッドがストリームを閉じるということは非常に明白です。

ストリームを自分で開く場合は、いつでもストリームを閉じることができるtry-with-resourcesブロックを使用することができます。ブロックは作成時と同じレベルで抽象化されます。この場合、メソッド(ストリームが開かれたときよりも低いレベルで呼び出される)は、ストリームを閉じるべきではありません。

+0

私は、APIドキュメントに渡されたストリームを閉じて、実装者としてAPIに準拠させるために閉じなければならないと言っていることに同意します。だからこそ私はこの問題を抱えていました。実装を書いている間、私は作成しなかったストリームを閉じることが奇妙に感じられました。このストリームが後で必要になるシナリオを考えることができます。 – sdm

+0

あなたは間違いなく正しいsdmです。この場合、その動作が義務づけられていることを前提に、ドキュメントを介して非常に明確にしてください。 – vikingsteve

0

「ストリームを閉じる」でメソッドを文書化し、名前メソッドをreadAndCloseに変更します。

パラメータboolean closeStreamを作成し、trueの場合は閉じる。

また、ストリームがmark/seek/resetをサポートしていない場合は、ストリームを開いたままにする必要はありません。

+0

メソッドを* close ** s **ストリーム*でドキュメント化してください。それ以外の場合は、呼び出し元の指示のように見えます。 –

+0

"パラメータboolean closeStreamを作成し、trueの場合は閉じる。そのパラメータの意味はあいまいであるため、そうしない方がいいでしょう。他の方法と混同され、「真実」が「ストリームを開いたままにする」ことを意味すると考えるかもしれません。パラメータを使うつもりなら、意味を自己文書化するので、2要素列挙型の 'enum Blah {KEEP_OPEN、CLOSE}'が良いでしょう。 –

+0

ストリームを閉じることができる場合は、それを文書化する必要があります –

0

一般に、そのクラスに関連付けられていないストリームを閉じることはお勧めしません。続き

は理由があり、そのメソッドに渡された

  1. ストリームは、いくつかの他の場所で使用することができます。 再利用可能なストリームはjavaで利用できます。ストリームが閉じている場合は、 を再度開いて再利用することはできません。
  2. ストリームを閉じるときに例外が発生した場合は、それを処理する方法がわかりません。 あなたは、一般的な入力ストリームを扱っているので、それ ファイルなどの任意の場所から来るかもしれない、ネットワークなど

クラスは、ストリームがそれを閉じるための責任があるが開きます。

関連する問題