gpt4 book ai didi

java - 为什么 close() 输入流很好?

转载 作者:IT老高 更新时间:2023-10-28 21:03:00 25 4
gpt4 key购买 nike

为什么需要close() java.io.InputStream 或其子类?

现在有了java.io.OutputStream,比如说FileOutputStream,在写入一个文件之后,如果我们不close()输出流,我们打算写入文件的数据保留在缓冲区中,不会写入文件。

所以有必要close()一个OutputStream。但是在不关闭一个InputStream之后我从来没有任何痛苦的经历。

但互联网上的所有文章和书籍仍然说关闭任何流总是好的,可能是 InputStreamOutputStream

所以我的问题是,为什么需要 close() 一个 InputStream?人们说你可能会面临你不 close() 它的内存泄漏。那么这是一种什么样的内存泄漏呢?

最佳答案

一个 InputStream 占用了一个很小的内核资源,一个低级文件句柄。此外,文件将在一定程度上被锁定(从删除、重命名),只要您将其打开以供读取。假设您不关心锁定的文件。最终,如果您需要读取另一个文件,并使用新的 InputStream 打开它,内核会依次为您分配一个新的描述符(文件流)。这最终会加起来。如果它是一个长时间运行的程序,那么程序失败只是时间问题。

处理器的文件描述符表通常大小有限。最终文件句柄表将用完进程的空闲槽。即使是数千个,您仍然可以轻松地为长时间运行的应用程序耗尽它,此时您的程序无法再打开新文件或套接字。

进程文件描述符表很简单,如下所示:

IOHANDLE fds[2048];  // varies based on runtime, IO library, etc.

您从占用 3 个插槽开始(STDIN、STDOUT、STDERR)。此外,任何网络套接字和其他类型的 IPC 都将使用同一张表中的插槽。填写它,您就对您的程序执行了拒绝服务。

所有这些很高兴知道;如何最好地应用它?

如果您依赖本地对象超出范围,那么它取决于垃圾收集器,它可以在自己的甜蜜时间收获它(不确定性)。不要依赖 GC,显式关闭流。

对于 Java,您希望在实现 java.lang.AutoCloseable 的类型上使用 try-with-resources,“包括所有实现 java.io.Closeable 的对象”,根据文档:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

在 C# 中,等效于实现 IDisposable 的对象上的“使用” block

关于java - 为什么 close() 输入流很好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541513/

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