在Java中,我需要关闭InputStream吗?

55

我的代码是:

InputStream confFile=classLoader.getResourceAsStream("myconffile.properties");

文档中写道:

InputStream 的 close 方法不做任何事情。

这是不是意味着我不需要关闭 InputStream?

2个回答

42

您需要关闭输入流,因为您提到的方法返回的流实际上是FileInputStream或其他一些持有文件句柄的InputStream的子类。如果您不关闭此流,则会导致资源泄漏。


1
在大多数情况下,我认为它不会是FileInputStream。 - Michael Borgwardt
我应该调查一下,遗憾的是我目前手头没有任何Java实例。不过,我同意你的看法,它正在持有一个文件句柄。 - Boris Strandjev
finalize() 方法不会为你关闭资源流吗? - Ryan Amos
1
@Ryan Amos:是的 - 在运行时,如果它运行的话。这可能需要任意长的时间,足够让你用尽文件句柄。或者删除或重命名操作失败。这实际上发生在我的身上(不是使用资源流):我想修改图像文件的EXIF元数据。这涉及到创建具有更新元数据的文件副本,然后删除原始文件并将副本重命名为原始文件的名称。不幸的是,EXIF操作库没有关闭原始文件上的输入流,这导致删除失败(大多数时间)。 - Michael Borgwardt
@MichaelBorgwardt 您是正确的,根据我的实验,它似乎是ByteArrayInputStream - Boris Strandjev
显示剩余3条评论

24

不是这样的,因为InputStream是一个抽象类,而getResourceAsStream()返回一个具体子类,其close()方法会执行某些操作 - 最重要的是释放文件句柄。


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