关闭 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?
是否有必要,没有,但这确实是一个很好的做法。如果你查看ByteArrayInputStream
和ByteArrayOutputStream
中的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();
...
我在这篇 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?
是否有必要,没有,但这确实是一个很好的做法。如果你查看ByteArrayInputStream
和ByteArrayOutputStream
中的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();
...