【问题标题】:FindBugs: "may fail to close stream" - is this valid in case of InputStream?FindBugs:“可能无法关闭流” - 这在 InputStream 的情况下是否有效?
【发布时间】:2011-02-03 23:26:30
【问题描述】:

在我的 Java 代码中,我启动了一个新进程,然后获取它的输入流来读取它:

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

FindBugs 在这里报错:

may fail to close stream
Pattern id: OS_OPEN_STREAM, type: OS, category: BAD_PRACTICE

我必须关闭另一个进程的 InputStream 吗?更重要的是,根据its Javadoc, InputStream#close() 什么都不做。那么这是误报,还是我应该在完成后真正关闭进程的输入流?

【问题讨论】:

    标签: java stream findbugs


    【解决方案1】:

    在这种情况下,您想要close() Reader,这将关闭其底层流。是的,关闭流总是一个好习惯,即使此时您知道您正在查看的实现没有做任何事情(尽管事实上,它在这里做!)。如果后来改变了怎么办?

    FindBugs 仅用于警告可能的错误;它不能总是确定。

    最后是的,您的 Java 进程拥有您生成的进程和 Process 对象。您绝对需要关闭它和输出流。没有其他人在使用它们,而且,做这些事情以避免与操作系统相关的流有趣的事情是很重要的。

    【讨论】:

    • 好的,我又一次失败了,依赖于实现...我现在关闭阅读器,正如你所建议的那样。
    【解决方案2】:

    我认为关闭所有打开的流总是一个好习惯。最好在 finally{} 块中。既然它没有像 java 所说的那样做,为什么不调用 close() 方法。它没有害处。

    【讨论】:

      【解决方案3】:

      InputStream 是一个抽象类 - 仅仅因为 它的 实现什么都不做并不意味着 process.getInputStream() 返回的对象的实际类型没有。

      在这种特殊情况下未能关闭输入流可能不会造成任何伤害 - 但我个人不会指望它。像关闭任何其他输入流一样关闭它。除此之外,这会使您的代码更加健壮,以防您决定将其更改为从其他内容中读取-(比如说)从文件中读取太容易了,而不会注意到您没有关闭FileInputStream

      【讨论】:

      • 没有注意到它是抽象的,真是太失败了——真丢脸……好吧,我会关闭它。让我感到困惑的是,并不是我明确地打开了流。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      相关资源
      最近更新 更多