1. 程式人生 > >《黑馬程式設計師》 裝飾類-自定義BufferedReader和LineNumberReader

《黑馬程式設計師》 裝飾類-自定義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();
//	}
//}