一般使用完IO流之后都要通过close()来关闭,以释放系统资源。
例如以下代码中需要通过使用oos.close(),以释放资源
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("df.dat")));如果使用后把引用变量设为null(如oos=null),是否IO流会被GC回收,之前就无需关闭了呢?望Java高手解答,谢
例如以下代码中需要通过使用oos.close(),以释放资源
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("df.dat")));如果使用后把引用变量设为null(如oos=null),是否IO流会被GC回收,之前就无需关闭了呢?望Java高手解答,谢
close是主动回收。直接回收掉。
没有其他选择,必然close
会被置为null。
但是外层的对象还在。
其实是一样的。
都不是上来就释放的。java没这个机制。java全部都是托管给GC程序的。
还占用非内存资源(如文件句柄、socket句柄或其它)
close是释放 非内存的部分。
内存资源在java中由GC控制。还记得 finalize 方法吗,
GC回收某个实例的内存资源前会先调用这个方法,以便做相关清理工作。
合理的假设,可认为IO流的实现会在 finalize 中检查是否释放了非内存资源,
没的话就在这里做,所以从大局来看不会有资源泄漏。
但会延迟非内存资源的释放,缺点可以想象得到。还是手动close最好。
设为null后,在开一个流放到这个文件上,看能不能正常使用这个流。
ObjectOutputStream oos;
while(true)
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("df")));
这样的代码我试了试,貌似能一直跑……
原来我还以为会耗尽资源
于是我想到,如果我把外层的IO流手动close了,包裹在里层的IO流也会同时自动被close吗?还是要等到外层被回收时里层才被close并被回收?比如说我close了oos,那么里层的new BufferedOutputStream(new FileOutputStream("df.dat"))和new FileOutputStream("df.dat")也会同时被close吗?