gpt4 book ai didi

java - 需要关闭什么类型的流以及为什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:54 26 4
gpt4 key购买 nike

Thinking in Java 一书中提到

Notice that any code that opens a file guards the file’s close( ) call in a finally clause to guarantee that the file will be properly closed.

但是其他来源呢?至少目前我知道 stdinstdoutstderrByteArrayInputStreamByteArrayOutputStream不需要关闭

至于stdin, stdout, stderr 我有两个不需要关闭的原因:

  1. 它们在 Java 运行时中是单例
  2. stdin 的 sink 是屏幕,stdoutstderr 的来源是键盘,失去与屏幕的连接是没有意义的,键盘

关于 ByteArrayInputStreamByteArrayOutputStream,Java 文档告诉:

Closing a ByteArrayInputStream has no effect. The methods in this class can be called after the stream has been closed without generating an IOException.

我猜可能是因为数组在磁盘以外的 volatile 内存中

但是我对那些分析非常确定,所以我想得到更准确和权威的答案,特别是当我们自己设计流时,什么时候必须关闭流,什么时候不能?

同时,我想确认我关于不必要的关闭的推理是正确的,或者,如果有人能给出更多的理由,那将不胜感激

最佳答案

如果流使用需要释放的操作系统资源,则需要关闭它。文件、网络连接等就是这种情况。

更重要的是,关闭一个流可以保证它被刷新,即任何尚未写入的数据都将被刷新。如果您只是在没有正确关闭流的情况下退出您的程序,则可能例如文件丢失数据。

也就是说,最好关闭您正在使用的所有 流。请注意,“关闭 ByteArrayInputStream 无效”意味着它也没有任何负面影响,因此只需关闭您不再需要的所有内容即可。

至于System流(inouterr),你不要关闭那些因为您还没有打开它们,代码中的某些其他地方可能仍想使用它们。

关于java - 需要关闭什么类型的流以及为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49385093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com