プログラムの 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 などの新しい構造に置き換えることはほとんどありません。つまり、「壊れていない場合は、直さないでください。」
この状況を考えると、これは実際にリソース リークでしょうか?