3

サーブレットに次のコードがある場合:

Properties p = new Properties();
p.load(getClass().getResourceAsStream("/test.properties"));

FindBugsを介してサーブレットを実行すると、警告OS_OPEN_STREAMが表示されると予想されますが、表示されません。同様のアプローチを使用してファイルシステム上の任意のファイルを開くと(つまり、クラスパスにない場合)、期待どおりにFindbugsの警告が表示されます。

Properties p = new Properties();
p.load(new FileInputStream(new File("c:/test.properties")));

最初の例では、Findbugsに有効な警告がないため(つまり、Propertiesオブジェクトにロードした後にfinallyブロックでストリームを閉じる必要があるため)、警告はありませんか、それともストリームを閉じる必要がない理由がありますか?

ありがとう

リッチ

4

1 に答える 1

7

警告の説明を見てください:

このメソッドはIOストリームオブジェクトを作成し、それをどのフィールドにも割り当てません...

最初のケースでは、コードはストリームを作成せず、クラスローダーにストリームを提供するように要求します。したがって、Findbugsは、おそらく誤検知を回避するために、コードがストリームを閉じる責任があるとは見なしません。

getResourceAsStream()クラスローダーは、ストリームを閉じる必要のない方法で実装できることに注意してください(つまり、リソースをメモリにコピーしてを返すことによってByteArrayInputStream)。ただしURLClassLoader、ディレクトリからクラスをロードする一般的なケースでは、ファイルハンドルのリークを回避するために、ストリームを閉じる必要があります。

于 2010-07-28T14:54:26.937 に答える