《黑马程序员》 装饰类-自定义BufferedReader和LineNumberReader

来源:互联网 发布:简易购物网站源码 编辑:程序博客网 时间:2024/05/17 22:50
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();}elsesb.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{  //自定义的LineNumberReaderprivate 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();//}//}

0 0