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

时间:2010-04-03 09:44:49

标签: java stream findbugs

在我的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()什么都不做。那么这是一个误报,还是我在完成后真的应该关闭流程的输入流?

3 个答案:

答案 0 :(得分:4)

在这种情况下,您希望close() Reader,这将关闭其基础流。是的,关闭流是一种很好的做法,即使你知道你正在查看的实现没有做任何事情(尽管事实上它确实在这里!)。如果以后改变了怎么办?

FindBugs只是警告可能的错误;它无法一直确定。

最后是的,您的Java进程拥有您生成的进程和Process对象。你绝对需要关闭它和输出流。没有其他人在使用它们,并且,做这些事情以避免与OS相关的流程有趣的业务非常重要。

答案 1 :(得分:3)

InputStream是一个抽象类 - 只是因为它的实现没有做任何事情并不意味着process.getInputStream()返回的实际对象类型没有。

在这种特殊情况下,未能关闭输入流可能不会造成任何伤害 - 但我个人不会指望它。关闭它就像关闭任何其他输入流一样。除了其他任何东西之外,如果您决定将其更改为从其他内容中读取,那么这会使您的代码更加强大 - 相反,(例如)从文件中读取将会非常容易,而不会注意到您没有关闭FileInputStream

答案 2 :(得分:0)

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