不过我用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()呢?
可以这样看: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 ....... }
to: dickensi(流星·逐日)(★★★★) :也就是说在代码(1)处初始化的时候并没有调用read()函数,而是在代码(2)调用readLine的时候才调用read()函数的是吗?另外我还想问问,怎么能看到readLine的源代码,我想知道为什么他就是调用的Reader里面的read()函数的?不亲眼看到我还是觉得很虚幻。
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 .......
}
就象Thread,必须重载run()方法一样.如果还不明白,就看FileReader源码,
你会看到read()什么也不做,等着你做呢.
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是很精妙的!:-)
楼上讲得比我好,就不多言了.
然后多调用几次readLine();不就能看出来了!
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);
}
}
}