如果未手动关闭流,流何时关闭?

2022-09-04 07:58:12

我想知道如果流没有手动关闭,它何时关闭。我的意思是,如果流的引用范围不再存在,它是否会被关闭?

请考虑以下示例方案。

Class A{
 InputStream in;
 OutputStream out;
 A(){
  // Initialize and create the streams.
 }
 ...
}
Class B{
 public void myMethod(){
 A a = new A();
 System.out.println("End of my method.")
 }
...
}

在这里,一旦我完成了流,我就退出了,但程序反过来的过程不会终止并继续执行其他操作。myMethod()

我没有关闭流。一旦对类A的引用范围结束,它会自动关闭吗?(即何时结束)?GC会照顾到这一点吗?另外,我读到,一旦进程结束,流将被关闭,系统将释放为其保留的所有资源用于其他进程。我们如何检查流是否打开?Java中是否有任何linux命令或选项来检查这一点?myMethod()

任何帮助是值得赞赏的!


答案 1

我不认为JVM规范对此有任何保证。你真的应该关闭这些资源。finally

当该过程结束时,操作系统将释放与其关联的所有资源(包括内存,文件句柄和网络套接字)。

有一些操作系统工具可以检查打开的文件和流,例如lsof


答案 2

如果有一种方法可以在垃圾回收流时释放资源。FileInputStreamfinalize()

并不是说你可以或应该依靠它。这才是事实。 另一方面,重写以显式不执行任何操作,依赖于关闭资源(并且没有方法)。FileInputStreamSocketInputStreamfinalize()SocketSocketfinalize()


推荐