我在
Java编程语言方面有丰富的经验.但是,我一直以来一直在想,为什么要关闭()java.io.InputStream或其子类呢?
现在用java.io.OutputStream说FileOutputStream,在写入一个文件之后,如果我们不关闭()输出流,我们打算在文件中写入的数据保留在缓冲区中,不会写入文件.
所以必须关闭()一个OutputStream.但是在没有关闭InputStream之后,我从来没有任何痛苦的经历.
但是互联网和书籍上的所有文章仍然说,关闭任何Stream总是很好,可能是InputStream或OutputStream.
所以我的问题是为什么要关闭()一个InputStream?人们说你可能会面临一个内存泄漏你不要关闭()它.那么什么样的内存泄漏呢?
解决方法
一个InputStream绑定了一个小内核资源,一个低级别的文件句柄.此外,只要您打开读取文件,该文件将在某种程度上被锁定(从删除,重命名).让我们想象你不关心锁定的文件.最终,如果您需要阅读另一个文件,并用新的InputStream打开它,内核会为您分配一个新的描述符(文件流).这将加起来.
这只是一个时间问题,直到长时间运行的程序出现程序失败.
处理器的文件描述符表的大小有限.最终,文件句柄表将用完该过程的空闲插槽.即使是数千,您仍然可以轻松地将其用于长时间运行的应用程序,此时,您的程序将无法再打开新的文件或套接字.
进程文件描述符表与以下简单化一样:
IOHANDLE fds[2048]; // varies based on runtime,IO library,etc.
你从3个插槽开始.填写完毕,您对自己执行了拒绝服务.