我在我们的一个程序上运行了一个动态代码分析工具,这种模式被识别为资源泄漏:
...
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)替换它们——即,“如果它没有坏,就不要修理它。”
鉴于这种情况,这实际上是资源泄漏吗?