【问题标题】:Findbugs "Method May Fail to Close Stream" when using getResourceAsStream使用 getResourceAsStream 时出现“方法可能无法关闭流”的问题
【发布时间】:2010-07-28 14:46:51
【问题描述】:

如果我在 servlet 中有以下代码:

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

如果我通过 FindBugs 运行 servlet,我希望收到警告 OS_OPEN_STREAM,但我没有。如果我使用类似的方法打开文件系统上的任意文件(即不在类路径中),我会按预期收到 Findbugs 警告:

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

在第一个示例中,警告是因为 Findbugs 缺少有效警告(即我应该在加载到 Properties 对象后在 finally 块中关闭流)还是没有我不需要关闭的原因流?

谢谢

丰富

【问题讨论】:

    标签: java tomcat findbugs


    【解决方案1】:

    查看警告的描述:

    该方法创建一个 IO 流 对象,不将其分配给任何 字段...

    在您的第一种情况下,您的代码不会创建流,它要求类加载器给它一个流。因此,Findbugs 不会认为您的代码负责关闭流,可能是为了避免误报。

    请注意,类加载器可以以不需要关闭流的方式实现getResourceAsStream()(即将资源复制到内存并返回ByteArrayInputStream)。但是对于URLClassLoader 从目录加载类的常见情况,确实需要关闭流以避免泄漏文件句柄。

    【讨论】:

    • 我相信这只是 findbug 的疏忽。关闭信息流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多