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

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();
//	}
//}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值