代码之家  ›  专栏  ›  技术社区  ›  thSoft

findbugs:“可能无法关闭流”-对于inputstream,这是否有效?

  •  3
  • thSoft  · 技术社区  · 14 年前

    在我的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
    

    必须关闭其他进程的输入流吗?更重要的是,根据 its Javadoc ,inputstream close()不做任何操作。那么这是一个误报,还是应该在我完成后关闭进程的输入流?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Sean Owen    14 年前

    在这种情况下,你想 close() 这个 Reader 将关闭其基础流。是的,关闭流总是一个好的实践,即使此时您知道正在查看的实现没有任何作用(尽管实际上它在这里起作用!)如果后来改变了呢?

    findbugs只是在那里警告可能的错误;它不能总是确定。

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

        2
  •  3
  •   Jon Skeet    14 年前

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

    在这种特殊情况下,不关闭输入流可能不会造成任何伤害——但我个人不会指望它。像关闭任何其他输入流一样关闭它。除了其他任何东西,这使得代码更加健壮,以防您决定将其更改为从其他东西中读取——相反,从文件中读取代码太容易了,而且不会注意到您没有关闭 FileInputStream .

        3
  •  0
  •   bragboy    14 年前

    我认为关闭你打开的所有溪流总是一个好的做法。最好是在最后块中。因为它不像Java所说的那样做,所以为什么不调用Cuffe()方法。这是无害的。