我想知道使输出流为空而不是关闭它的后果。如果我做out = null,这会导致资源泄漏吗?
4 回答
总是close
你的流。
Stream
它不仅像普通 java 一样是堆上的普通对象object
,它处理底层操作系统进行编写。
然后冲洗不会发生,如果你做你的参考null
查看关闭的文档
刷新此输出流并强制写出任何缓冲的输出字节。flush 的一般约定是,调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地。
那么如果你只是简单地制作上面的程序reference
呢null
?
您的问题不会从 jdk7 提出
如果您使用的是 java7,即try-with-resources 语句,那么您将永远不必显式关闭流。
如果我这样做
outputStream = null
,这会导致资源泄漏吗?
可能是的,尽管这取决于流(最终)连接到什么。
另一个问题是它是否重要。这也取决于...
如果流在输出管道中包含缓冲区,则分配
null
而不是关闭可能会导致缓冲数据丢失。如果您重复执行此操作,泄漏的资源可能会累积,最终导致您的应用程序失败,因为它已用完“文件描述符”。
另一方面,如果您缓慢地泄漏资源,则流可能会在“文件描述符”短缺出现之前被垃圾收集并最终确定。(该
finalize()
方法调用close()
...)
但无论哪种方式,最好的做法是调用... 并通过使用“try / finally”或“try with resources”close()
来确保关闭总是发生。分配null
而不是打电话close()
是自找麻烦。
在不知道 outputStream 的实现的情况下,很难回答您的问题。但请记住,当您将变量设置为 null 时,您并没有消除该变量最初指向的对象。将某些内容设置为 null 并不等同于在 C++ 中调用 delete say,或者在 Objective-C 中调用 release。没有自动调用的清理代码。这正是 close() 首先存在的原因。你可以假设,既然它存在,它就可以用来做它所说的——清理资源。
简而言之,答案是肯定的,这可能会泄漏资源。调用打算调用的方法进行清理!
通过 jsut 设置对null
您的引用,不会释放底层文件句柄。这意味着您依赖垃圾收集器和终结来执行此操作,这很可能会导致运行时错误,因为如果终结无法跟上,操作系统会耗尽文件句柄。此外,还不确定您写入流的内容何时会进入磁盘。