黑马程序员技术交流社区
标题:
关于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