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

4

3 回答 3

5

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

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

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

于 2010-04-03T10:23:58.157 回答
4

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

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

于 2010-04-03T09:55:08.290 回答
0

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

于 2010-04-03T09:55:35.777 回答