《黑馬程式設計師》 裝飾類-自定義BufferedReader和LineNumberReader
阿新 • • 發佈:2019-02-12
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(); // } //}