在java中,类LineNumberReader是BufferedReader的直接子类,BufferedReader是Reader的子类。
类LineNumberReader不仅实现了BufferedReader的功能,在其基础上还增加了获取行号的功能。
代码为:
class MyLineNumberReader
{
private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r)
{
this.r = r;
lineNumber = 0;
}
public void setLineNumber(int lineNumber)
{
this.lineNumber = lineNumber;
}
public int getLineNumber()
{
return lineNumber;
}
public String myReadLine() throws IOException
{
lineNumber++;
StringBuilder sb = new StringBuilder();
int ch;
while((ch=r.read())!=-1)
{
if(ch == '\r')
continue;
else if(ch == '\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myClose()throws IOException
{
r.close();
}
}
类myLineNumberReader中,提供了构造方法,初始化Reader对象,还提供了类似LineNumberReader类中的获取行号、设置行开始数字的方法getLineNumber()与setLineNumber()。在方法myReadLine()中,每执行一次,行号加一,并返回r对象的一行值。
在我之前的博客中提到了BufferedReader方法,对比两个方法可以很明显的看出,这个类是BufferedReader类的增强版,BufferedReader中实现的方法在myLineNumberReader中全部实现,为了提高代码的重用性,在myLineNumberReader类可继承BufferedReader类:
class MyLineNumberReader extends myBufferedReader
{
private int lineNumber;
MyLineNumberReader(Reader r)
{
super(r);
lineNumber = 0;
}
public void setLineNumber(int lineNumber)
{
this.lineNumber = lineNumber;
}
public int getLineNumber()
{
return lineNumber;
}
public String myReadLine() throws IOException
{
lineNumber++;
return super.myReaderLine();
}
}