2

プログラムの 1 つで動的コード分析ツールを実行したところ、このパターンがリソース リークとして特定されました。

...
FileInputStream fileInputStream = new FileInputStream(file);
try {
    data = someMethod(new BufferedInputStream(fileInputStream));
    // Assume that someMethod(InputStream) internally reads the stream
    // until BufferedInputStream.read() returns -1.
    ...
}
finally {
    ...
    try {
        fileInputStream.close();
    } catch (IOException e) {
        ...
    }
}

具体的には、分析ツールはnew BufferedInputStream(...)呼び出しが閉じられていないため、リソース リークとしてマークしました。ただし、このパターンでは、基になるストリームfileInputStreamが閉じられBufferedInputStream、スコープ外になります。

注:最初に質問を投稿したときに明確にすることを怠りましたが、これが「最良の」実装ではないことを認識しています。ただし、ここに事実上のリソース リークがない場合、このパターンのすべてのインスタンスについて従来のコードベースを精査し、外側のストリームを閉じるか、try-with-resources などの新しい構造に置き換えることはほとんどありません。つまり、「壊れていない場合は、直さないでください。」

この状況を考えると、これは実際にリソース リークでしょうか?

4

3 に答える 3

0

Java にはデコンストラクターがないため、オブジェクトがスコープ外に出ても必ずしもストリームが閉じられるとは限りません。Java にはファイナライザーがありますが、それらが呼び出されるという保証はありません。BufferedInputStream は必ずしも閉じられるわけではありません。ただし、基になるストリームが閉じているため、それは問題ではないと思います。

ストリームが閉じていることを確認することをお勧めしますが、おそらく問題にはなりません。

于 2013-09-11T16:32:30.413 に答える