A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lcjasas 中级黑马   /  2013-4-5 16:29  /  1666 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lcjasas 于 2013-4-6 22:00 编辑

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.println(line);
                }
                bufr.close();
        }
}
(FileReader )建立的对象,是不是因为其没有具体的构造函数就不用fr.close();
还是说FileReader fr = new FileReader(".....");对象建立后,就自动结束了?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 邓宫财 于 2013-4-5 16:59 编辑

这是BuffereReader的close方法代码
  1. public void close() throws IOException {
  2.         synchronized (lock) {
  3.             if (in == null)
  4.                 return;
  5.             <font color="#ff00ff">in.close();//关闭的就是外部传入的字符读取流</font>
  6.             in = null;
  7.             cb = null;
  8.         }
  9.     }
复制代码
BufferedReader的构造方法BufferedReader(Reader in)就是调用的这个构造。
  1.     public BufferedReader(Reader in, int sz) {
  2.         super(in);
  3.         if (sz <= 0)
  4.             throw new IllegalArgumentException("Buffer size <= 0");
  5.        <font color="#ff00ff"> this.in = in;//外部传进的字符读取l流,赋给了BufferedReader</font>
  6.         cb = new char[sz];
  7.         nextChar = nChars = 0;
  8.     }
复制代码
分析,其实BufferedReader的缓冲技术就是把传入的Reader读取的数据,存起来,然后一起读取给你。这就是缓冲技术。
所以BufferedReader的关闭实际上是关闭的是传入的输入流。
这类问题,最好的方法就是读源码。
bufr.close();//实际上是调用的fr.close();

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
我也才学IO流这里我的理解是这样的,你可以参考下:

首先第一点你问的是不是没有构造函数,这里的思想就错了,没有构造函数你咋创建的fr对象呢?

而你创建了这个对象 定义成名字FR只是为了下面调用的时候使用,这时在内存中已经存在这个流了 ,所以就必须得执行关闭动作。

而在执行bufr。close方法的时候的原理实际上调用的就是fr。close这两个类是继承关系的,bufr.close()方法的内部实现就是调用的父类的close方法。


点评

感觉有些不靠谱。我说的是没有具体的构造函数。。。不是没有构造函数。。。  发表于 2013-4-5 19:14

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 鼓励一下~

查看全部评分

回复 使用道具 举报
这个流是必须得关的也就是执行bufr.close();BufferedReader的缓冲技术就是在执行bufr.readLine会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个,程序再次读取时, 就不用找文件了, 直接从缓冲区中获取,直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个;如果你不关流的话可能会导致数据在缓冲区内无法读取,而且流一直开着会一直和文件关联着会占用内存。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得追问,或者结贴~  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马