Java 回收垃圾时,DataInputStream是否关闭包装的InputsReal?
考虑以下Java代码:Java 回收垃圾时,DataInputStream是否关闭包装的InputsReal?,java,stream,garbage-collection,finalizer,Java,Stream,Garbage Collection,Finalizer,考虑以下Java代码: void test(InputStream inputStream) { DataInputStream dataInputStream = new DataInputStream(inputStream); return; } 当test方法返回时,dataInputStream(有时)将被垃圾收集。DataInputStream是否在其终结器中关闭内部流 我找不到任何明确的陈述,如果它有或没有。是否有任何关于行为的官方文件?如果有,请你指出一点好吗
void test(InputStream inputStream) {
DataInputStream dataInputStream = new DataInputStream(inputStream);
return;
}
当test
方法返回时,dataInputStream(有时)将被垃圾收集。DataInputStream是否在其终结器中关闭内部流
我找不到任何明确的陈述,如果它有或没有。是否有任何关于行为的官方文件?如果有,请你指出一点好吗
谢谢
编辑:我不是问关闭DataInputStream是否也会关闭内部流。我在问,如果我不关闭,外部流被垃圾收集,而内部流仍然有对它的引用,因此仍然是活动的。没有文档明确说明,
DataInputStream
没有终结器,但是你可以用类没有做的事情填充书籍。由于finalize()
方法的目的是释放一个坏程序忘记释放的资源,因此只有承载资源的类才可能有这样的安全网。但是DataInputStream
不包含资源,因此没有这样的finalize()
方法
底层的
InputStream
可能会保存资源,因此,只有当底层的InputStream
变得不可访问时,保护清洁器才可以释放资源。当您仍然持有对输入流的强引用时,您无法控制的代码错误地关闭了您的输入流时,这肯定会被视为破坏行为。@tunaki OP询问流是否会因为GC终结器而在没有显式关闭调用的情况下关闭-答案是否,既然没有这样的finalizer@wero是的,我就是这么问的。是否在某些地方记录了“没有这样的终结器”?它是特定于实现的还是规范强制的?有链接吗?谢谢。@Volkan只需查看DataInputStream
的源代码,就可以建立层次结构-没有终结器。java.io
中唯一具有终结器的类是FileInputStream
和FileOutputStream
。不知道那是不是文件。