2009-09-07 27 views
152

私がFileReaderを巻き付けBufferedReaderのを使用してローカルファイルを読んでいる:FileReaderとBufferedReaderの両方をclose()する必要がありますか?

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
// read the file 
// (error handling snipped) 
reader.close(); 

は私もFileReaderclose()する必要がありますか、またはラッパーはそれを処理しますか? 私は人々がこのような何かを、コードを見てきました:

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 
// read the file 
// (error handling snipped) 
bReader.close(); 
fReader.close(); 

このメソッドは、サーブレットから呼び出されて、私は私が開いているハンドルを残していないことを確認したいと思います。

+4

あなたはこのような情報のソースを読むことができます。 JDKのインストールディレクトリのsrc.zipにすべて入っています。または、http://www.docjar.com/html/api/java/io/BufferedReader.java.htmlなどのオンラインで読むことができます。 – gustafc

+36

誰かに読めるように伝えるソースは "RTFM!"というよりも悪いです。ソースにバグがある場合はどうなりますか?暗黙のうちに*正しい*振る舞いが何であるかを知りたいですか? – Raedwald

+1

まあ...この観点から:API仕様を指し示すことはそれほど優れていません。ドキュメントに指定されているように動作しないバグがソースにない場合は、ドキュメントを信頼できません。そのような質問に答える良い方法はありません。 – Atmocreations

答えて

179

いいえ。

BufferedReader.close() 

BufferedReaderInputStreamReader

ならびに

FileReader.close() 

ないのJavadocに係るストリームを閉じます。

+7

+1は簡潔さと明快さの組み合わせです。 – CPerkins

+11

'BufferedReader'のコンストラクタが例外をスローしない限り。他のリソースとバッファリングを持つデコレータに注意する必要がありますが、基本ストリームを閉じるだけではよりクリーンです。 –

+6

Javadocは、 'BufferedReader.close()'が基になるリーダーを閉じるかどうかを指定しません。その説明は単に 'Reader.close()'からコピーされます。これは実際の実際の動作かもしれませんが、これは文書化されていません。 –

6

BufferedReaderソースによると、この場合、bReader.closeはfReader.closeを呼び出します。技術的には後者を呼び出す必要はありません。

4

BufferedReaderのソースコードは、BufferedReaderを閉じると、その基盤が閉じられていることを示しています。

+0

これは具体的なものにリンクするためのものですが、これはOpenJDKの実装を指しているだけで、JavaDocsは 'Reader#close()'では不明なので、Oracle JDK例えば、同様の方法で実施される。 – searchengine27

83

他の人が指摘しているように、外側のラッパーを閉じるだけで済みます。

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 

BufferedReaderコンストラクタは(例えばOutOfMemoryError)例外をスローした場合、これはファイルハンドルをリークすることができることを非常にスリムなチャンスがあります。あなたのアプリがこの状態にある場合、クリーンアップの必要性は、他のプログラムに割り当てるリソースをOSから奪うことがいかに重要であるかによって決まるかもしれません。

ラッパー・コンストラクタは、Java 5または6に失敗する可能性がある場合Closeableインターフェースを使用することができる。

try (Reader reader = new FileReader(fileName); 
    BufferedReader buffered = new BufferedReader(reader)) { 
    // TODO: input 
} 

Reader reader = new FileReader(fileName); 
Closeable resource = reader; 
try { 
    BufferedReader buffered = new BufferedReader(reader); 
    resource = buffered; 
    // TODO: input 
} finally { 
    resource.close(); 
} 

のJava 7のコードは、トライ有する資源パターンを使用する必要があります

+3

ありがとう、それは非常に啓発されました。 – Zilk

+0

同じように:http://stackoverflow.com/a/2732760/281545 –

0

あなたはbufferedReader、つまりreader.close()を閉じる必要があります。正常に動作します。

3

ソースコードを確認した後、私は、たとえばことが判明:

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 

BufferedReaderのオブジェクトにclose()メソッドは、最終的に希望リーダークラスの抽象close()メソッドを呼び出すことになります実装されたメソッドをInputStreamReaderクラスで呼び出すと、InputStreamオブジェクトが閉じられます。

したがって、bReader.close()だけで十分です。

+1

ソースコードが示すものは参照として引用できません。これは、*仕様*が言います。この場合、Javadocは信頼できるものです。 – EJP

関連する問題