while((line=in.readLine())!=null)至public int read() throws IOException 至int result=read(buf,0,1);至public int read(char[] buf,int from,int len) throws IOException

解决方案 »

  1.   

    不过我用jb单步调试,程序运行到:BufferedReader in=new .....这行下面马上就跳到了boolean intag=false;这行,然后就开始运行public int read(char[] buf,int from,int len)了,我不明白构造类对象的时候为什么就能运行read(char[] buf,int from,int len)????to: saintKnight(saintKnight) : 你说的"while((line=in.readLine())!=null)至public int read() throws IOException"   ,这一步是怎么实现的?为什么调用readLine()就会运行read()呢?
      

  2.   

    可以这样看:read()被重载了,而在readline()中的代码如下:
    readline(){
    char[] buf;
    int from = 0;
    int len = MAX_BUFFER;
    int i =0;
    if(read(buf, from, len)=-1) return -1;
    while (buf[i] != '/n'){
    i++;
    }
    return .......

      
      

  3.   

    to:ggyy_csdn(开心): 我还是觉得不够说服力,因为我们既然不能访问到readLine的代码,那编程人员怎么能够知道该代码里面调用了read这个方法呢?也就是编程人员无法事先预知要重载read()这个方法而使它能在自己的应用程序里面被应用阿???
      

  4.   

    这是对象重载的机制.父类提供空接口,子类必须重载,以供父类调用.如同回调.
    就象Thread,必须重载run()方法一样.如果还不明白,就看FileReader源码,
    你会看到read()什么也不做,等着你做呢.
      

  5.   

    楼上的,您是说当程序调用RemoveHTMLReader的时候,类RemoveHTMLReader自动调用read()方法是吗?
      

  6.   

    我昨天跟你回复了,可惜csdn死了!受不了!:-(
    1)BufferedReader in=new BufferedReader(new RemoveHTMLReader(new FileReader(args[0]))); 
    2)while((line=in.readLine())!=null)             
    重要概念:上塑造型,下塑造型,FilterReader的父类Reader*代码1)等价于
      Reader temp = new RemoveHTMLReader(new FileReader(args[0])));
      BufferedReader in = new  BufferedReader (temp);   
      temp = null;
      通过上塑造型把BufferedReader的Reader指定为一个RemoveHTMLReader的实例*代码2)调用的BufferedReader的readLine()函数,readLine() 调用的Reader
     的read()函数,Reader通过下塑造型得到FilterReader再下塑造型得到最终的实
     例是一个RemoveHTMLReader对象因此调用的为RemoveHTMLReader的read()其实Reader好像是个虚类吧,他获取read()的方法都是通过下塑造型得到的,程序员没必要晓得代码里面调用了read这个方法,代码会自动帮你做!程序员在写程序
    的时候只要晓得实现Reader的时候必须实现read方法!这正是OOP多态性的重要体现之一!
    oop是很精妙的!:-)
      

  7.   

    RemoveHTMLReader的read()方法是由BufferedReader调用的.
    楼上讲得比我好,就不多言了.
      

  8.   

    to: dickensi(流星·逐日)(★★★★) :也就是说在代码(1)处初始化的时候并没有调用read()函数,而是在代码(2)调用readLine的时候才调用read()函数的是吗?另外我还想问问,怎么能看到readLine的源代码,我想知道为什么他就是调用的Reader里面的read()函数的?不亲眼看到我还是觉得很虚幻。
      

  9.   

    你在你写的read()内加入System.out.print("hihi");
    然后多调用几次readLine();不就能看出来了!
      

  10.   

    BufferedOutputStream中两段代码:
    1.
    private void fill()中:
    int n;
    do {
        n = in.read(cb, dst, cb.length - dst);
    } while (n == 0);
    if (n > 0) {
        nChars = dst + n;
        nextChar = dst;
    }2.
        String readLine(boolean ignoreLF) throws IOException {
    StringBuffer s = null;
    int startChar;
    boolean omitLF = ignoreLF || skipLF;        synchronized (lock) {
                ensureOpen(); bufferLoop:
        for (;;) { if (nextChar >= nChars)
        fill();
    if (nextChar >= nChars) { /* EOF */
        if (s != null && s.length() > 0)
    return s.toString();
        else
    return null;
    }
    boolean eol = false;
    char c = 0;
    int i;                /* Skip a leftover '\n', if necessary */
    if (omitLF && (cb[nextChar] == '\n')) 
                        nextChar++;
    skipLF = false;
    omitLF = false;     charLoop:
    for (i = nextChar; i < nChars; i++) {
        c = cb[i];
        if ((c == '\n') || (c == '\r')) {
    eol = true;
    break charLoop;
        }
    } startChar = nextChar;
    nextChar = i; if (eol) {
        String str;
        if (s == null) {
    str = new String(cb, startChar, i - startChar);
        } else {
    s.append(cb, startChar, i - startChar);
    str = s.toString();
        }
        nextChar++;
        if (c == '\r') {
    skipLF = true;
        }
        return str;
    }

    if (s == null) 
        s = new StringBuffer(defaultExpectedLineLength);
    s.append(cb, startChar, i - startChar);
        }
            }
        }