【问题标题】:Does DataInputStream close wrapped InputSream when garbage collected?垃圾收集时 DataInputStream 是否关闭包装的 InputStream?
【发布时间】:2016-05-01 19:22:39
【问题描述】:

考虑下面的Java代码:

void test(InputStream inputStream) {
    DataInputStream dataInputStream = new DataInputStream(inputStream);
    return;
}

test 方法返回时,dataInputStream 将(有时)被垃圾回收。 DataInputStream 是否在其终结器中关闭内部流?

我没有找到任何明确的声明,无论是否。有没有关于行为的官方文档?有的话可以指点一下吗?

谢谢。

编辑:我不是在问关闭 DataInputStream 是否也关闭了内部流。我在问如果我不关闭并且外部流被垃圾收集而内部仍然有对它的引用因此是活着的。

【问题讨论】:

  • @tunaki OP 询问是否会因为 GC 终结器而在没有明确关闭调用的情况下关闭流 - 答案是否定的,因为没有这样的终结器
  • @wero 是的,我就是这么问的。 “没有这样的终结器”是否记录在某个地方?它是特定于实现的还是规范强制的?有链接吗?谢谢。
  • @Volkan 只需查看DataInputStream 的源并向上处理层次结构 - 没有终结器。 java.io 中唯一带有终结器的类是 FileInputStreamFileOutputStream。不知道那是不是任何地方的文件。

标签: java stream garbage-collection finalizer


【解决方案1】:

没有文档明确指出 DataInputStream 没有终结器,但你可以用类做的事情来填满书籍。由于finalize() 方法的目的是释放一个损坏的程序忘记释放的资源,因此只有承载资源的类才可能具有这样的安全网。但是DataInputStream 不持有资源,因此没有这样的finalize() 方法。

底层的InputStream 可能持有资源,因此,只有当底层的InputStream 变得无法访问时,保护清理器才可能释放资源。当您控制之外的代码虚假地关闭您的 InputStream 而您仍然持有对它的强引用时,它肯定会被视为破坏行为。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多