Sre*_*S R 9 java inputstream outputstream stream
我想知道如果一个流没有手动关闭,它何时关闭.我的意思是,如果它的引用范围不再是,那么流将被关闭吗?
请考虑以下示例场景.
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.")
}
...
}
Run Code Online (Sandbox Code Playgroud)
在这里,一旦我完成了流,我正在退出,myMethod()但程序反过来进程,不会终止并继续其他操作.
我没有关闭溪流.一旦A类参考范围结束,它会自动关闭吗?(即myMethod()结束时)?GC会照顾到吗?此外,我读到,一旦进程结束,流将被关闭,系统将释放为其他进程保留的所有资源.我们如何检查流是否开放?是否有来自Java的任何linux命令或选项来检查?
任何帮助表示赞赏!
如果您不手动关闭它,那么当进程终止时,所有非托管资源将被释放,但这不是推荐或最佳实践。完成后,您应该始终关闭流。
管理流的更好和建议的方法是使用 try 和资源选项,如下所示:
try (InputStream input = new FileInputStream(...);
Reader reader = new InputStreamReader(input, ...)) {
...
}
Run Code Online (Sandbox Code Playgroud)
我没有关闭流。一旦A类的引用范围结束,它会自动关闭吗?
不,它不会自动关闭。
一个很好的参考是:
在这种情况下,FileInputStream有一种finalize()方法可以在流被垃圾收集时释放资源。
并不是说您可以或应该依赖它。这就是它的FileInputStream作用。SocketInputStream另一方面,覆盖finalize()显式地什么都不做,依靠Socket关闭资源(并且Socket没有finalize()方法)。