当前位置: 首页 > 面试题库 >

为什么close()一个inputstream很好?

督灿
2023-03-14
问题内容

我在Java编程语言方面有丰富的经验。但是,我一直想到的一件事是,为什么必须要使用close() java.io.InputStream它或其子类?

现在,使用java.io.OutputStream,例如FileOutputStream,在写入文件后,如果我们没有close()输出流,那么我们打算在文件中写入的数据将保留在缓冲区中,并且不会写入文件中。

因此,有必要成为close()一个OutputStream。但是,我从来没有过之后任何痛苦的经历 不打烊InputStream

但是仍然所有互联网和书籍上的文章都说,关闭任何Stream总是一件好事,不论它是InputStream还是an OutputStream

所以我的问题是,为什么有必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的对象上的“ using”块



 类似资料:
  • 问题内容: 虽然有一种方法没有。这是为什么?文件在完成后会自动关闭吗? 谢谢! 问题答案: 该类的javadoc将类描述为: 文件和目录路径名的抽象表示。 只是路径名的一种表示形式,有一些关于文件系统(如)和目录处理的方法,但是实际的流输入和输出在其他地方完成。流可以打开和关闭,文件不能。 (我个人的看法是,不幸的是Sun后来继续创建,给命名不一致带来了很大的困惑。)

  • 也许我的证书理解中缺少了什么。CA不应该发布他们的根CA吗?也就是说,他们不是应该高喊“这是我的根,来抓他们吧。”为什么我这么难找到这个根证书?

  • 几个相关问题: 是什么导致第一次读取返回1179字节?某种文件头? 为什么从中读取的内容分页到2048字节的大小,而不是包装指定的值? 是否有方法将配置为从缓冲区读取2048字节以上?

  • 为了尽快获得一个可以高效使用的工作软件系统,不仅需要为开发做计划,还需要为文档,部署,市场做计划。在一个商业工程里,这还需要销售和金融计划。没有对开发时间的预测能力,是不可能高效预测以上这些东西的。 好的估计提供了预测能力。管理者喜欢,而且应该这么做。事实是这不可能,不论是理论上还是实践上,准确预测开发软件所消耗的时间总是被管理者所忽视。我们总是被要求做那些不可能的事情,而且我们必须诚实地面对它。

  • 问题内容: 执行此强制转换时出现编译错误: 应该被继承,尽管不能直接继承。 从文档: 农具其中inturn & 为什么这无效? 也感谢您提供有关使用as 的正确方法的意见? 我正在考虑包装方法。 问题答案: 扩展,并且 不 扩展。 如果您想从中获得帮助,我认为实现包装器类是您最简单的选择。幸运的是的唯一抽象方法是。 RandomAccessFile实现了DataInput,该数据输入将依次转为Da

  • 问题内容: 我最近找到了一个示例代码: 该方法将打开一个用户界面窗口。然后,我尝试将代码修剪如下: 两种版本均能正常工作。有什么区别? 问题答案: 任何一种代码都能在99%的时间内工作。 但是,Swing的设计使得对Swing组件的所有更新都应在事件分发线程(EDT)上完成。阅读有关并发的Swing教程以获取更多信息。 问题是它有1%的时间可能无法正常工作。您不想浪费时间尝试调试随机问题。