【问题标题】:Closing InputStream and OutputStream关闭 InputStream 和 OutputStream
【发布时间】:2018-02-25 20:16:31
【问题描述】:

我在post 中读到,每当使用 fileinputstream 或 outputstream 时都会分配处理的低级文件,因此总是需要关闭 io 流。对于不处理文件或网络 io 的其他流(例如:ByteArrayInputStream),是否有必要关闭流?如果有,为什么?

【问题讨论】:

  • 如果您关闭每个流,则永远无法不关闭流。担心哪些不适合你的时间。
  • @Oleg:您引用的问题没有回答专门针对ByteArrayInputStream 的问题(但答案相同......)
  • @sruetti 我认为它足够相似,可以复制。我已经看到拥有金徽章的用户关闭了声称他们“有效地”重复的问题,但它们的相似性要低得多。

标签: java inputstream outputstream


【解决方案1】:

您通常必须关闭流,无论是显式 (Stream.close()) 还是使用 try-with-resources,如您引用的帖子或 javapractices.com @SassyRegards201 引用的文章中所述.

如果你认真对待你的编程,没有“它通常不工作”。您可能在不关闭流的情况下逃脱的唯一方法是,如果明确记录特定实现不需要关闭(如ByteArrayInputStream of Oracle JDK 7 和OpenJDK code)并且您是确保仅使用此实现。更改 JDK 的版本或供应商可能会使您的假设无效!

问题是您应该针对接口编程。由于所有流都实现了定义close() 方法的Closeable 接口(旨在被调用以释放资源),因此实现可能会以有一天可能需要的方式发生变化,您调用关闭方法。

关闭每个流不会花费太多(性能和开发人员时间),只是良好做法,现在由错误查找软件检查.

【讨论】:

  • 对不起,我没有像他那样解释。大声笑
【解决方案2】:

我在这篇文章中读到,每当使用 fileinputstream 或 outputstream 时都会分配处理的低级文件,因此总是需要关闭 io 流。

一个文件输入或输出流是的。其他网络流也必须关闭,因为它们具有文件描述符。

如果其他流(例如:ByteArrayInputStream)不处理文件或网络io,是否需要关闭流?如果有,为什么?

是否有必要,不,但这肯定是一个好习惯。如果您查看ByteArrayInputStream 和ByteArrayOutputStream 中的close() 方法,您会发现它是空操作:

public void close() throws IOException {
}

在实践方面,如果您养成总是关闭流的习惯,那么稍后切换到使用不同的流会更好。我们将代码和模式从代码中的一个位置复制到其他位置,以便做正确的事情并关闭每个流可能会在以后有所帮助。

在 Java 7+ 中,您可以使用 try with resources 来自动关闭流:

try (OutputStream stream = new ByteArrayOutputStream()) {
    ...
}

或者你可以使用try/finally:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
    ...
} finally {
    baos.close();
}
byte[] bytes = baos.toByteArray();
...

【讨论】:

  • 这就是 try-finally 变脏的地方: Imho baos.close(); 应该包含在 try {...} catch (IOException ioe) {//ignore} 中,因为 close() 被声明为抛出 IOException...
  • 通常我使用 apache IOUtils.closeQuietly(...) 处理空流并忽略 IOException @sruetti。
【解决方案3】:

这不是绝对必要的,但它是一种首选做法,就像 java 中的很多东西一样。

http://www.javapractices.com/topic/TopicAction.do?Id=8

这是一个链接,您可以在该链接上阅读流并关闭它们以及为什么应该关闭它们。

希望这有帮助!

【讨论】:

  • 谢谢@Sassy。在发布之前,我查看了此链接。它说,链接的流将被关闭。但是我不确定为什么在没有链接调用导致文件或网络 io 时必须关闭它。
  • 好吧,这样想吧。将您的信息流想象成一个门户。该门户可以通向一个地方,但之后连接关闭。门户不能有无限连接。
  • 您需要关闭门户,以免泄漏。所以人们不会到处传送。我的意思是我认为这是我能给出的最好的解释,哈哈。
  • 是的。很高兴它有帮助;)
猜你喜欢
  • 2011-05-05
  • 2012-08-03
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多