黑马程序员技术交流社区

标题: 复习io流时突然想到的一个问题 [打印本页]

作者: 孙沛    时间: 2012-9-15 22:02
标题: 复习io流时突然想到的一个问题
今天做车时突然蹦出了个io流的问题
import java.io.*;
class  BufferedReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                //创建一个读取流对象和文件相关联。
                FileReader fr = new FileReader("buf.txt");
                //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
                BufferedReader bufr = new BufferedReader(fr);       

                String line = null;
                while((line=bufr.readLine())!=null)
                {
                        System.out.print(line);
                }
                bufr.close();
        }
}

这个问题呢,就是java有垃圾回收机制,反射内存中没有被调用的对象,会自动回收,但是缓冲流也在内存中啊,也是一个对象,为什么他需要关闭啊,bufr.close();




作者: 冯心程    时间: 2012-9-15 22:08
个人想法
你不关闭流 流就一直关联着源  关联着没关闭就不是垃圾啊 垃圾回收机制怎么会回收它呢  
作者: 程金    时间: 2012-9-15 23:16
本帖最后由 程金 于 2012-9-15 23:28 编辑

流不单在内存中分配了空间,也在操作系统占有了资源,java的gc是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知OS来释放这个资源。假如你打开了一个文件流没关闭,这时候你去双击打开文件,操作系统会提示你文件正在被占用.java的gc仅仅管理java虚拟机的内存,回收不使用的对象,你需要需要手动close流来释放系统资源
作者: 尤圣回    时间: 2012-9-15 23:23
因为 底层调用的是c c没有自动垃圾回收机制 所以呀自动关闭
作者: 黄敏    时间: 2012-9-15 23:32
import java.io.*;
class  BufferedReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                //创建一个读取流对象和文件相关联。
                FileReader fr = new FileReader("buf.txt");
                //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
                BufferedReader bufr = new BufferedReader(fr);        

                String line = null;
                while((line=bufr.readLine())!=null)
                {
                        System.out.print(line);
                }
                bufr.close();
        }
}

这个问题呢,就是java有垃圾回收机制,反射内存中没有被调用的对象,会自动回收,但是缓冲流也在内存中啊,也是一个对象,为什么他需要关闭啊,bufr.close();

给你说说啊,这是我的理解  希望对你有帮助。


加入说现在有一个A程序就是对操作系统中 文件进行读取写入操作,但是你没有这句bufr.close(),你这个bufr对象和这buf.txt就一直连接着,没有释放,就像你打电话没有挂断一样  这时候,程序中另外一个方法来对buf.txt文件进行写入操作,你试想想  你之前的电话都没挂断,现在有别人给你打电话你能接通吗(是电话不是手机),
还有需要说明的是,这个跟垃圾回收机制没有关系,对文件进行IO流操作  bufr.close()这句的意思是告诉jvm释放对操作系统中的bur.txt文件的操作。操作系统就知道了bufr.txt A程序不用了  别的程序可以对其操作了 





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