我需要在 Java 中关闭 InputStream 吗?
Posted
技术标签:
【中文标题】我需要在 Java 中关闭 InputStream 吗?【英文标题】:Do I need to close an InputStream in Java? 【发布时间】:2012-03-21 19:33:27 【问题描述】:我的代码是:
InputStream confFile=classLoader.getResourceAsStream("myconffile.properties");
在文档中:
InputStream 的 close 方法什么都不做。
是否意味着我不需要关闭 InputStream?
【问题讨论】:
【参考方案1】:您确实需要关闭输入流,因为您提到的方法返回的流实际上是FileInputStream 或InputStream
的其他一些子类,其中包含文件句柄。如果您不关闭此流,则存在资源泄漏。
【讨论】:
我认为在大多数情况下它不会是 FileInputStream。 我应该对此进行调查,遗憾的是我目前手头没有任何 java 实例。但是,我同意你的观点,它持有一个文件句柄。 finalize() 方法不会为你关闭资源流吗? @Ryan Amos:是的 - 何时以及是否运行。这可以是任意长时间之后,足够你用完文件句柄的时间。或者删除或重命名操作失败。实际发生在我身上的事情(不是资源流):我想修改图像文件的 EXIF 元数据。这涉及使用更新肉食创建文件的副本,然后删除原始文件并将副本重命名为原始文件的名称。不幸的是,EXIF 操作库没有关闭原始文件上的输入流,导致删除失败(大部分时间)。 @MichaelBorgwardt 你是对的,在我的实验中似乎是ByteArrayInputStream
。【参考方案2】:
不,这并不意味着 - 因为InputStream
是一个抽象类,而getResourceAsStream()
返回一个具体的子类,它的close()
方法做了一些事情——最重要的是释放一个文件句柄。
【讨论】:
以上是关于我需要在 Java 中关闭 InputStream 吗?的主要内容,如果未能解决你的问题,请参考以下文章