在我的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()什么都不做。那么这是一个误报,还是我在完成后真的应该关闭流程的输入流?
答案 0 :(得分:4)
在这种情况下,您希望close()
Reader
,这将关闭其基础流。是的,关闭流是一种很好的做法,即使你知道你正在查看的实现没有做任何事情(尽管事实上它确实在这里!)。如果以后改变了怎么办?
FindBugs只是警告可能的错误;它无法一直确定。
最后是的,您的Java进程拥有您生成的进程和Process
对象。你绝对需要关闭它和输出流。没有其他人在使用它们,并且,做这些事情以避免与OS相关的流程有趣的业务非常重要。
答案 1 :(得分:3)
InputStream
是一个抽象类 - 只是因为它的实现没有做任何事情并不意味着process.getInputStream()
返回的实际对象类型没有。
在这种特殊情况下,未能关闭输入流可能不会造成任何伤害 - 但我个人不会指望它。关闭它就像关闭任何其他输入流一样。除了其他任何东西之外,如果您决定将其更改为从其他内容中读取,那么这会使您的代码更加强大 - 相反,(例如)从文件中读取将会非常容易,而不会注意到您没有关闭FileInputStream
。
答案 2 :(得分:0)
我认为关闭所有打开的流总是一个很好的做法。最好在finally {}块中。因为它没有像java所说的那样,所以为什么不调用close()方法。它无害。