FindBugs:“可能无法关闭流” - 在InputStream的情况下这是否有效?

3
在我的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?而且,根据它的Javadoc,InputStream#close()什么也不做。那么这是误报吗,还是当我完成后真的应该关闭进程的输入流?

3个回答

5
在这种情况下,您需要close() Reader,它将关闭其底层流。是的,关闭流始终是一个好习惯,即使此时您知道您正在查看的实现不做任何事情(尽管实际上在这里确实有作用!)。如果以后更改了呢?
FindBugs只能警告可能出现的错误;它并不能总是确定。
最后,是的,您的Java进程拥有您生成的进程和Process对象。您最终需要关闭它和输出流。没有其他人在使用它们,并且这样做很重要,以避免与操作系统相关的流问题。

好的,我又失败了,依赖于实现...我现在关闭阅读器,就像你建议的那样。 - thSoft

4
InputStream 是一个抽象类 - 它的实现没有做任何事情,并不意味着 process.getInputStream() 返回的实际对象类型不会。在这种特殊情况下,不关闭输入流可能不会造成任何伤害 - 但我个人不会指望它。像关闭其他输入流一样关闭它。除此之外,如果您决定从其他来源读取数据,这使得您的代码更加强大 - 很容易(例如)从文件中读取,并未注意到没有关闭 FileInputStream

没有意识到它是抽象的,真失败 - 我真是太丢人了... 好的,我会关闭它。让我感到困惑的是,不是我明确地打开了流。 - thSoft

0
我认为关闭你打开的所有流是一个很好的习惯。最好在finally{}块中实现。虽然Java说这样做不会对程序产生影响,但为什么不调用close()方法呢?这样做没有任何害处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接