黑马程序员技术交流社区

标题: 关于IO中close的疑惑 [打印本页]

作者: 张豪杰    时间: 2013-2-26 11:46
标题: 关于IO中close的疑惑
本帖最后由 张豪杰 于 2013-2-26 17:53 编辑

java中的垃圾回收机制,不是不断释放不再被程序引用的对象么?
为什么还要用close方法去关闭流资源对象呢?
作者: Benwolf0818    时间: 2013-2-26 11:55
因为java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流、socket等之类的资源用完之后一定要关闭。而且垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。
作者: 黑马刘杰    时间: 2013-2-26 11:55
我们在程序中创建的对象都是对应现实世界中有形或无形的事物,计算机操作系统所产生的东西当然也是现实世界中的事物,
也就是说,程序中的对象也可以对应计算机操作系统所产生的一个其他东西,专业地说,这些东西叫资源,流就是操作系统产生的一种资源。

当我们在程序中创建了一个IO流对象,同时系统内也会创建了一个叫流的东西,在这种情况下,计算机内存中实际上产生了两个事物,一个是Java程序中的类的实例对象,一个是系统本身产生的某种资源。
Java垃圾回收器只能管理程序中的类的实例对象,没法去管理系统产生的资源,所以程序需要调用close方法,去通知系统释放其自身产生的资源。


作者: 王小丑    时间: 2013-2-26 11:59
首先你得先明白垃圾回收的含义:具体来说回收机制就是 当一些资源被创建使用之后或不在调用的话 就会变成垃圾,垃圾的话会占用空间,这时候就需要释放空间给其他程序使用,所以JAVA拥有自动垃圾回收机制,会在适当的时候自动调用垃圾回收 释放资源,程序员也可以手动调用释放资源等等。
如:public class A
{
String str;public A(String str)
{       
this.str=str;
}       
public String toString()
{               
return str;       
}       
@Override        protected void finalize() throws Throwable
{               
System.out.println("我是"+str+".我被回收了..");       
}       
public static void main(String[] args)
{               
A a=new A("李四");               
a=null;               
System.gc();   //运行结果 我是李四.我被回收了..       
}
}
对于为什么还要用close方法去关闭流资源对象呢 原因很简单因为:
流不单在内存中分配了空间,也在操作系统占有了资源,java的GC是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知OS来释放这个资源。

作者: 何伟    时间: 2013-2-26 14:07
为什么要自己close呢?因为java的垃圾回收机制是很懒的,除非垃圾满天飞,不然它不出来,而且垃圾回收机制非常耗资源,当它出来系统也会"卡"
java回收机制是不定时不定期出现的,close是必须的
java是无法直接访问本地文件的,
比如要访问本地txt文件
java先跟本地系统打个招乎,在调用本地的如:记事本这类程序访问txt文件
用完close是必须的,有借有还再借不难{:soso_e113:}
close的都是本地资源





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2