我需要在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

InputStream 在 spring 控制器中关闭

如何在java中关闭当前工作目录(不是完整路径)[关闭]

检查在java中关闭的游标

在 Java 中关闭数据库连接

在 Java 中关闭 OutputStream 的正确方法? [复制]

Java IOException 流在服务器客户端程序中关闭