2011-09-08 14 views
14

InputStreamやOutputStreamなどのJavaの多くのI/Oリソースは、終了時にhereのように終了する必要があります。Javaで閉じられていないI/Oリソースを見つけるには?

このようなリソースがクローズされていない場所、たとえばプロジェクトを検索するにはどうすればよいですか?この種のエラー:

private void readFile(File file) throws IOException { 
    InputStream in = new FileInputStream(file); 
    int nextByte = in.read(); 
    while (nextByte != -1) { 
     // Do something with the byte here 
     // ... 
     // Read the next byte 
     nextByte = in.read(); 
    } 
    // Oops! Not closing the InputStream 
} 

私は、このようなPMDやFindBugsのなど、いくつかの静的解析ツールを試してみたが、彼らは間違っているようではないフラグ上記のコードを実行します。ジャワ7において

+3

FindBugsでもこれを検出できるようです:http://stackoverflow.com/questions/2570820/findbugs-may-fail-to-close-stream-is-this-valid-in-case-of- inputstream – Thilo

+1

FindBugsがどのルールをチェックするかを調整する必要がありますか? –

答えて

1

、彼らのような、(SOトライして、リソースと呼ばれる)は、現在のスコープ内で閉鎖可能なリソースを使用しての機能を追加しました:古いバージョンで

public void someMethod() { 
    try(InputStream is = new FileInputStream(file)) { 
     //do something here 
    } // the stream is closed here 
} 

、一般的な技術はtry-使用されますcatch-finallyチェーン。

+1

私の質問はJava 6以前であり、「try then finally close」テクニックを使用しない場合の検索方法は? –

+0

GoogleはFindBugsがそのような種類のバグを見つけることができると言います –

5

設定 - IDEプラグインでFindBugsを実行し、OS_OPEN_STREAMを報告しました。

+0

FindBugsで何をする必要があるかを詳しく説明できますか? IMOでは、ulimitを使い果たしたときにアプリケーションクラッシュの副作用があったため、これはデフォルトで有効になっていたはずです。 – bram

6

変更されたルールを持つFindBugsが機能しない場合は、ヒープ解析が遅くなる可能性があります。 VisualVMでは、OQLを使用してヒープ・ダンプ内の任意の時点で開いている特定のタイプのすべてのオブジェクトを問い合せることができます。プログラムのその時点でアクセスすべきでないファイルに対してストリームが開いているかどうかを確認できます。

%>jvisualvm 

は、実行中のプロセスを選択します。それを実行

は同じくらい簡単です。ヒープダンプを保存するオプションを選択するか、ヒープダンプを開き、ブラウザのファイルストリームのクラスインスタンスを参照するか、またはそれらを照会します。

関連する問題