3

我想知道使输出流为空而不是关闭它的后果。如果我做out = null,这会导致资源泄漏吗?

4

4 回答 4

4

总是close你的流。

Stream它不仅像普通 java 一样是堆上的普通对象object,它处理底层操作系统进行编写。

然后冲洗不会发生,如果你做你的参考null

查看关闭的文档

刷新此输出流并强制写出任何缓冲的输出字节。flush 的一般约定是,调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地。

那么如果你只是简单地制作上面的程序referencenull

您的问题不会从 jdk7 提出

如果您使用的是 java7,即try-with-resources 语句,那么您将永远不必显式关闭流。

于 2013-10-08T14:07:34.160 回答
3

如果我这样做outputStream = null,这会导致资源泄漏吗?

可能是的,尽管这取决于流(最终)连接到什么。

另一个问题是它是否重要。这也取决于...

  • 如果流在输出管道中包含缓冲区,则分配null而不是关闭可能会导致缓冲数据丢失。

  • 如果您重复执行此操作,泄漏的资源可能会累积,最终导致您的应用程序失败,因为它已用完“文件描述符”。

  • 另一方面,如果您缓慢地泄漏资源,则流可能会在“文件描述符”短缺出现之前被垃圾收集并最终确定。(该finalize()方法调用close()...)

但无论哪种方式,最好的做法是调用... 并通过使用“try / finally”或“try with resources”close()来确保关闭总是发生。分配null而不是打电话close()是自找麻烦。

于 2013-10-08T14:11:30.583 回答
0

在不知道 outputStream 的实现的情况下,很难回答您的问题。但请记住,当您将变量设置为 null 时,您并没有消除该变量最初指向的对象。将某些内容设置为 null 并不等同于在 C++ 中调用 delete say,或者在 Objective-C 中调用 release。没有自动调用的清理代码。这正是 close() 首先存在的原因。你可以假设,既然它存在,它就可以用来做它所说的——清理资源。

简而言之,答案是肯定的,这可能会泄漏资源。调用打算调用的方法进行清理!

于 2013-10-08T14:08:29.500 回答
0

通过 jsut 设置对null您的引用,不会释放底层文件句柄。这意味着您依赖垃圾收集器和终结来执行此操作,这很可能会导致运行时错误,因为如果终结无法跟上,操作系统会耗尽文件句柄。此外,还不确定您写入流的内容何时会进入磁盘。

于 2013-10-08T14:10:09.657 回答