<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # JAVA之旅(二十六)——裝飾設計模式,繼承和裝飾的區別,LineNumberReader,自定義LineNumberReader,字節流讀取操作,I/O復制圖片 * * * ## 一.裝飾設計模式 > 其實我們自定義readLine就是一種裝飾模式 * 當想要對已有的對象進行功能增強時,可以定義一個類,將已有對象傳入,并且提供加強功能,那么自定義的該類就稱為裝飾類 ~~~ package com.lgl.hellojava; public class HelloJJAVA { public static void main(String[] args) { Person p = new Person(); p.eat(); // 開始進行增強 superPerson p1 = new superPerson(p); p1.superEat(); } } class Person { public void eat() { System.out.println("吃飯"); } } class superPerson { private Person p; public superPerson(Person p) { this.p = p; } public void superEat() { System.out.println("小菜+吃飯"); } } ~~~ > 這里的邏輯就是當我們吃飯這個功能需要增強的時候,我們應該裝飾他 * 裝飾類通常會通過構造方法接收被裝飾的對象,并基于被裝飾的對象的功能提供更強的功能 ## 二.繼承和裝飾的區別 > 你現在知道了裝飾模式,那你一定會疑問,和繼承的道理類似,對吧,我們現在來說下他們的區別 > > 這里我們就不寫代碼了,我們看注釋 ~~~ package com.lgl.hellojava; public class HelloJJAVA { public static void main(String[] args) { /** * MyReader:專門用于讀取數據的類 * MyTextReader:專門讀取文本 兩個向上抽取,形成繼承體系 */ /** * 想實現更多的功能 * MyBufferReader * myBufferTestReader */ /** *誰需要加強就傳誰進來 * class MyBufferReader{ * } */ } } ~~~ > 這個邏輯大概是這樣的,我們有兩個功能,一個讀取文件,一個讀取文本,他們其實是有共性的,你就把他們共性部分抽取出來,可是我現在在讀取文本的時候我順便想讀取圖片呢?其實,我們就是這樣才產生的裝飾者模式 * 裝飾者模式比繼承要靈活,避免了繼承體系的臃腫,而且降低了類與類之間的關系 * 裝飾類因為增強已有對象,具備功能和已有的想相同,只不過提供了更強的功能,所以裝飾類和被裝飾類通常屬于一個體系中的 ## 三.LineNumberReader > 這也是一個子類 ![這里寫圖片描述](http://img.blog.csdn.net/20160707214409225) > 他也是一個包裝類,我們看例子 ~~~ package com.lgl.hellojava; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; public class HelloJJAVA { public static void main(String[] args) { FileReader fr; try { fr = new FileReader("test.txt"); LineNumberReader lnr = new LineNumberReader(fr); String line = null; while((line = lnr.readLine()) != null){ System.out.println(lnr.getLineNumber()+":"+line); } lnr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ~~~ > 他輸出的結果 ![這里寫圖片描述](http://img.blog.csdn.net/20160707214921086) > 他可以獲取和設置行號 ## 四.自定義LineNumberReader > 我們可以根據他的原理自己也來實現一個,仔細看注釋 ~~~ package com.lgl.hellojava; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class HelloJJAVA { public static void main(String[] args) { try { FileReader fr = new FileReader("test.txt"); MyLineNumberReader my = new MyLineNumberReader(fr); String line = null; while ((line = my.MyReadLine()) != null) { System.out.println(my.getLineReader() + ":" + line); } my.MyClose(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class MyLineNumberReader { // 讀取 private Reader r; // 行號 private int lineReader; // 構造方法 public MyLineNumberReader(Reader r) { this.r = r; } // 提供對外方法 public String MyReadLine() { // 行號自增 lineReader++; StringBuilder sb = new StringBuilder(); int ch = 0; try { while ((ch = r.read()) != -1) { if (ch == '\r') continue; if (ch == '\n') return sb.toString(); else sb.append((char) ch); } if (sb.length() != 0) return sb.toString(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public int getLineReader() { return lineReader; } public void setLineReader(int lineReader) { this.lineReader = lineReader; } public void MyClose() { try { r.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ~~~ > 這個思路是不是很清晰,實際上和LineNumberReader是類似的 ## 五.字節流讀取操作 > 字符流我們講的差不多了,我們接著說字節,其實他們類似的,知識他操作的是字節而已 * inputStream:讀 * outputStream:寫 > 我們還是從例子開始 ~~~ package com.lgl.hellojava; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class HelloJJAVA { public static void main(String[] args) { writeFile(); } // 寫文件 public static void writeFile() { try { FileOutputStream fo = new FileOutputStream("demo.txt"); fo.write("test".getBytes()); fo.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ~~~ > 這里我們可以看到,他寫入數據不需要刷新,現在還沒有涉及到緩存區,我們繼續看,寫已經寫好了,現在我們開始讀,對于讀取數據,我們開頭用到的兩種方法 ~~~ // 字符讀數據 public static void readFile() { try { FileInputStream fs = new FileInputStream("demo.txt"); int ch = 0; while ((ch = fs.read()) != -1) { System.out.println((char) ch); } fs.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 字節讀取 public static void readFile1() { try { FileInputStream fs = new FileInputStream("demo.txt"); byte[] buf = new byte[1024]; int len = 0; while ((len = fs.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } fs.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ~~~ > 現在我們有了專門處理的字節流,我們可以這樣做 ~~~ public static void readFile2() { try { FileInputStream fs = new FileInputStream("demo.txt"); int num = fs.available(); System.out.println(num); fs.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ~~~ > 我們發現直接用available就可以拿到字節了,原理其實是這段代碼 ~~~ public static void readFile2() { try { FileInputStream fs = new FileInputStream("demo.txt"); byte[] buf = new byte[fs.available()]; fs.read(buf); System.out.println(new String(buf)); fs.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ~~~ ## 六.I/O復制圖片 > ok,這里算是一個小練習,復制一張圖片,我們理順下思路 * 1.用字節讀取流和圖片關聯 * 2.用字節流寫入流對象創建一個圖片文件,存儲數據 * 3.通過循環讀寫,完成數據存儲 * 4.關閉流 > OK,我們用代碼說話 ~~~ package com.lgl.hellojava; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class HelloJJAVA { public static void main(String[] args) { FileOutputStream fos = null; FileInputStream fis = null; try { // 復制 fos = new FileOutputStream("copy_img.png"); // 原圖 fis = new FileInputStream("img.png"); byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } fis.close(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ~~~ > 這樣。我們圖片就拷貝過來了 ![這里寫圖片描述](http://img.blog.csdn.net/20160707234857950) > 好的,知識點今天就到這里 ## 有興趣的可以加群:555974449,咱們一起學習,一起進步! 版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看