请问java Stream对象如果不关闭会发生什么?

比如FileStream或者说HttpClient 中的HTTPResponse,不关闭会发生什么呢?或者说调用close防范实际上在底层都做了哪些事?

阅读 5.9k
4 个回答

看是什么类了, 不同的类的close里执行的逻辑当然是不一样的. close就是用来做收尾工作的, 如果你学过servlet, 可以认为就是servletdestroy方法.
有一些类会占用特殊资源(比如文件句柄, 线程, 数据库连接等), 而这些资源是有限的/比较消耗性能的, 而且不会自动释放(或者需要很久才能自动释放), 因此需要你在不用的时候及时释放, 避免浪费资源.

比如IO里面的:

  • FileInputStream会占用系统里的一个文件句柄, 每个进程可以打开的文件数量是有限的, 如果一直打开而不关闭, 理论上迟早会遇到无法打开的情况.
  • StringWriter就没有什么. close方法没什么卵用
Closing a StringWriter has no effect. The methods in this class can be called after the stream has been closed without generating an IOException.

ps: FileInputStreamfinalize方法会自动调用close方法. 但是需要等待很长很长时间. 所以最好自己手工调用.

一般而言, 如果是接口里有close方法, 我们调用时是不应该关注close里究竟执行了什么, 不调用是不是有坏处, 而应该是始终调用

你打开文件是会在系统里有一个文件句柄的,这个句柄数量操作系统里是有限的,如果不close,这个句柄所代表的资源就泄露了,就跟悬垂指针一样,如果量大或时间长了之后再打开文件就可能打不开了,超过了系统的限制

不关闭可能不会释放资源,一直创建不释放资源会逐渐耗尽系统资源

调用Close实际就是释放资源或者关闭资源的一些操作。 现在很多Stream都实现了AutoCloseable接口,可以自动Close操作。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题