关闭 InputStream 和 OutputStream

Closing InputStream and OutputStream

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

这不是绝对必要的,但它是首选做法,就像 java 中的许多内容一样。

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

这里有一个 link,您可以在其中阅读有关流和关闭它们的信息,以及应该关闭它们的原因。

希望对您有所帮助!

您通常 必须关闭 流,无论是明确地 (Stream.close()) 还是使用 try-with-resources,如您引用的 post 中所述或在文章中 javapractices.com @SassyRegards201 引用。

如果您认真对待编程,就没有 "it usually works without"。不关闭流而逃脱的唯一方法是 明确记录 特定实现不需要关闭(与 ByteArrayInputStream of Oracle JDK 7 and in the OpenJDK code 一样)并且你是 确保仅使用此实现。更改 JDK 的版本或供应商可能会使您的假设无效!

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

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

I read in this post that a low level file handled is allocated whenever fileinputstream or outputstream is used and hence it is always necessary to close io stream.

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

In case of other streams(eg: ByteArrayInputStream) which do not deal with file or network io , is it necessary to close the streams? If so , why?

是否有必要,没有,但这确实是一个很好的做法。如果你查看ByteArrayInputStreamByteArrayOutputStream中的close()方法,你可以看到它是一个空操作:

public void close() throws IOException {
}

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

在 Java 7+ 中,您可以使用带有资源的 try 来自动关闭流:

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

或者您可以使用 try/finally:

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