如何在Java中找到未关闭的I / O资源?

2022-09-02 13:52:46

Java 中的许多 I/O 资源(如 InputStream 和 OutputStream)在完成后需要关闭,如此所述。

我如何在我的项目中搜索此类资源未被关闭的地方,例如这种错误:

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,但它们没有将上述代码标记为错误。


答案 1

这可能是设置问题 - 我通过我的IDE插件运行了FindBugs,它报告了OS_OPEN_STREAM。


答案 2

如果修改了规则的 FindBugs 对您不起作用,则另一种较慢的方法是堆分析。VisualVM 允许您使用 OQL 查询在任何给定时间在堆转储中打开的特定类型的所有对象。然后,您可以检查在程序中此时不应访问的文件的流是否打开。

运行它就像:

%>jvisualvm

选择正在运行的进程。选择“保存堆转储”选项(或类似内容),打开堆转储并在浏览器中查看文件流的类实例,或查询它们。


推荐