class MyBufferedReader extends Reader
{
//要覆盖父类中的抽象方法
private Reader r;
public MyBufferedReader(Reader r){
this.r=r;
}
//对功能增强
public String myReadLine() throws IOException {
StringBuilder sb=new StringBuilder();
int len; //记录读取到的字符
while((len=r.read())!=-1){
if(len=='\r')
continue;
if(len=='\n'){ //如果到了换行符
//返回内容
return sb.toString();
}else
sb.append((char)len);
}
if(sb.length()>0){
return sb.toString();
}
return null;
}
//接口中是实现,子父类中覆盖
public void close() throws IOException{ //父类中的是抽象的我们子类来实现
r.close();
}
public int read(char[] cbuf, int off, int len) throws IOException{
return r.read(cbuf,off,len); // 我们自己来实现
}
}
import java.io.*;
class MyLineNumberReaderDemo
{
public static void main(String[] args)
{
MyLineNumberReader mnr=null;
try{
mnr=new MyLineNumberReader(new FileReader(new File("d:\\temp.txt")));
String str;
while((str=mnr.myReadLine())!=null){
//我们来测试一下行号的功能
System.out.println(mnr.getLineNumber()+">>:"+str);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(mnr!=null){
mnr.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
class MyLineNumberReader extends MyBufferedReader{ //自定义的LineNumberReader
private int lineNumber; //有行号说明它有私有的成员变量是记录用户的行号
public MyLineNumberReader(Reader r){
// this.r=r;
//调用父类中的构造方法
super(r); //父类中有参的构造
}
public void setLineNumber(int lineNumber){ //设置和获取行号的方法
this.lineNumber=lineNumber;
}
public int getLineNumber() { //行号是在什么时候自增了? //是在读取一行之后
return this.lineNumber; //获取行号
}
public String myReadLine() throws IOException{ //自定义的读取一行的方法
this.lineNumber++; //读取一行,即调用了该方法,让行号自增
//下面的功能和父类是一样的。我们就不自己写了。我们直接调用父类的就可以了
return super.myReadLine(); //直接返回父类的方法的调用的结果
}
}
//class MyLineNumberReader extends MyBufferedReader{ //自定义的LineNumberReader
// //我们发现里面有些功能是和BufferedReader的功能是一样的
// //所以我们可以继承我们自定义的MyBufferedReader然后去除重复的功能。
//
// //提高扩展性。只要是Reader的子类对象都是可以进行包装的
// //我们需要覆盖里面的抽象方法
// //这里想起来了。是不是我们自定义的BufferedReader这里也没有改
// private int lineNumber; //有行号说明它有私有的成员变量是记录用户的行号
// //首先它有和BufferedReader一样的功能因为它是继承自BufferedReader
// //它和BufferedReader一样它都是对Reader的子类对象进行功能增强使用
private Reader r;
//
// public MyLineNumberReader(Reader r){
this.r=r;
// //调用父类中的构造方法
// super(r); //父类中有参的构造
// }
//
public int read(char[] cbuf, int off, int len) throws IOException{
return r.read(cbuf,off,len);
}
//
// public void setLineNumber(int lineNumber){ //设置和获取行号的方法
// this.lineNumber=lineNumber;
// }
//
// public int getLineNumber() { //行号是在什么时候自增了? //是在读取一行之后
// return this.lineNumber; //获取行号
// }
//
// public String myReadLine() throws IOException{ //自定义的读取一行的方法
// this.lineNumber++; //读取一行,即调用了该方法,让行号自增
// //下面的功能和父类是一样的。我们就不自己写了。我们直接调用父类的就可以了
// return super.myReadLine(); //直接返回父类的方法的调用的结果
StringBuilder sb=new StringBuilder();
int len=0;
while((len=r.read())!=-1){ //不停的读取数据 //这里的细节要注意
if(len=='\r')
continue;
if(len=='\n'){
return sb.toString(); //到了换行直接把内容返回
}else
sb.append((char)len);
}
if(sb.length()>0){
return sb.toString();
}
return null;
// }
//
public void close() throws IOException{ //关闭的方法
r.close();
}
//}
//class MyLineNumberReader extends Reader{ //自定义的LineNumberReader
// //提高扩展性。只要是Reader的子类对象都是可以进行包装的
// //我们需要覆盖里面的抽象方法
// //这里想起来了。是不是我们自定义的BufferedReader这里也没有改
// private int lineNumber; //有行号说明它有私有的成员变量是记录用户的行号
// //首先它有和BufferedReader一样的功能因为它是继承自BufferedReader
// //它和BufferedReader一样它都是对Reader的子类对象进行功能增强使用
// private Reader r;
//
// public MyLineNumberReader(Reader r){
// this.r=r;
// }
//
// public int read(char[] cbuf, int off, int len) throws IOException{
// return r.read(cbuf,off,len);
// }
//
// public void setLineNumber(int lineNumber){ //设置和获取行号的方法
// this.lineNumber=lineNumber;
// }
//
// public int getLineNumber() { //行号是在什么时候自增了? //是在读取一行之后
// return this.lineNumber; //获取行号
// }
//
// public String myReadLine() throws IOException{ //自定义的读取一行的方法
// this.lineNumber++; //读取一行,即调用了该方法,让行号自增
// StringBuilder sb=new StringBuilder();
// int len=0;
// while((len=r.read())!=-1){ //不停的读取数据 //这里的细节要注意
// if(len=='\r')
// continue;
// if(len=='\n'){
// return sb.toString(); //到了换行直接把内容返回
// }else
// sb.append((char)len);
// }
// if(sb.length()>0){
// return sb.toString();
// }
// return null;
// }
//
// public void close() throws IOException{ //关闭的方法
// r.close();
// }
//}
自定义的LineNumberReader 未优化版
//class MyLineNumberReader{
// private int lineNumber; //有行号说明它有私有的成员变量是记录用户的行号
// //首先它有和BufferedReader一样的功能因为它是继承自BufferedReader
// //它和BufferedReader一样它都是对Reader的子类对象进行功能增强使用
// private FileReader fr;
//
// public MyLineNumberReader(FileReader fr){
// this.fr=fr;
// }
//
// public void setLineNumber(int lineNumber){ //设置和获取行号的方法
// this.lineNumber=lineNumber;
// }
//
// public int getLineNumber(){ //行号是在什么时候自增了? //是在读取一行之后
// return this.lineNumber; //获取行号
// }
//
// public String myReadLine() throws IOException{ //自定义的读取一行的方法
// this.lineNumber++; //读取一行,即调用了该方法,让行号自增
// StringBuilder sb=new StringBuilder();
// int len=0;
// while((len=fr.read())!=-1){ //不停的读取数据 //这里的细节要注意
// if(len=='\r')
// continue;
// if(len=='\n'){
// return sb.toString(); //到了换行直接把内容返回
// }else
// sb.append((char)len);
// }
// if(sb.length()>0){
// return sb.toString();
// }
// return null;
// }
//
// public void close() throws IOException{ //关闭的方法
// fr.close();
// }
//}
《黑马程序员》 装饰类-自定义BufferedReader和LineNumberReader
最新推荐文章于 2021-04-01 09:28:55 发布