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
どこか閉じていますか?私は読者を閉じていないことにより、メモリリークを取得することはできますか?
読者が根底にあっても、クローズする必要がありますか
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
、特に... BufferedReader
。AはBufferedReader
、ストリーム上の先読みするおそれがあります。ストリームは、発信者によって使用されようとしている場合は後にあなたの方法に戻り、その後、バッファに読み込まれますが、この方法で消費されないされたすべてのデータが失われやすくなります。
良いアイデアは、合格するために、発信者のためになりますReader
。また、この方法は、として文書化する必要があります所有権服用のをInputStream
。その場合、それはすべき常にclose()
それ。