裝飾者模式——IO流運用

推薦博客
Java設計模式學習09
Java設計模式學習09
Java設計模式學習09

裝飾者模式還是比較難懂的除抛。。。椰憋。,我也說不了啥,詳解看上面博客,下面案例是我仿照上面博客寫的赔退。
  • Behaver 定義行為接口

      public interface  Behavior {
           void dressing();//化妝
      }
    
  • Person 人類

    public class Person implements Behavior {
      private Behavior behavior;
      public Person(Behavior behavior) {
        this.behavior = behavior;
      }
    
      @Override
      public void dressing() {
         behavior.dressing();
      }
    }
    
  • Animal 不可否認人也是動物

      public class Animal implements Behavior {
          @Override
          public void dressing() {
              System.out.println("化妝橙依。。硕旗。");
          }
      }
    
  • 男人

      public class Man extends Person {
    
          public Man(Behavior behavior) {
              super(behavior);
          }
    
          @Override
          public void dressing() {
              super.dressing();
              System.out.println("化男人妝窗骑。。漆枚。");
          }
      }
    
  • 女人

      public class Woman extends Person {
    
          public Woman(Behavior behavior) {
              super(behavior);
          }
    
          @Override
          public void dressing() {
              super.dressing();
              System.out.println("化女人妝创译。。墙基。");
          }
      }
    
  • 測試類

      /**
       * 裝飾者案例
       */
      public class Demo {
    
          public static void main(String[] args) {
              System.out.println("=====================動物化妝========================");
              Animal animal = new Animal();
              animal.dressing();
    
              System.out.println("=====================男人化妝========================");
              Man man = new Man(animal);
              man.dressing();
    
              System.out.println("=====================女人化妝========================");
              Woman woman = new Woman(animal);
              woman.dressing();
    
              System.out.println("=====================人妖化妝========================");
              Woman woman1 = new Woman(man);
              woman1.dressing();
          }
      }
    
結(jié)果

我們可以看到软族,實例化女人1的時候換了一個實例組合,于是就出現(xiàn)了新的功能碘橘。互订。。

字符輸出流使用緩沖----FileReader和BufferedReader

  • FileReader 文件字符輸入流
  • BufferedReader 緩沖字符輸入出流
BufferedReaderr緩沖字符輸出流痘拆,直接繼承自Reader

構(gòu)造方法

public BufferedReader(Reader var1, int var2) {
        super(var1);
        this.markedChar = -1;
        this.readAheadLimit = 0;
        this.skipLF = false;
        this.markedSkipLF = false;
        if(var2 <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        } else {
            this.in = var1;
            this.cb = new char[var2];
            this.nextChar = this.nChars = 0;
        }
    }

    public BufferedReader(Reader var1) {
        this(var1, defaultCharBufferSize);
    }

同BufferWriter一樣仰禽,兩個構(gòu)造方法。實例化的時候需要一個Reader實例。

運用案例
/**
 * 讀取Demo6.java的內(nèi)容
 */
public class Demo{
    public static final String PATH = "/Volumes/huang/studyfromGitHub/JavaForAndroid/JavaForAndroid/series10/src/main/java/com/example/Demo6.java";

    public static void main(String[] args) {
        //1.申明
        FileReader reader = null;
        BufferedReader bufferedReader = null;
        try {
            //2.實例化
            reader = new FileReader(PATH);
            bufferedReader = new BufferedReader(reader);
            //3.讀取
            String msg=null;
            while ((msg=bufferedReader.readLine())!=null){//如果是null吐葵,則表示文件結(jié)束
                System.out.println(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
結(jié)果

裝飾者模式再運用----自定義BufferReader

  • 自定義BufferReader類

      class CoustomerBufferReader {
          private Reader in;
          //緩沖數(shù)組
          private char[] buffer=new char[1024];
          //每次讀取的字符個數(shù)
          private int nChars;
          //緩沖數(shù)組的索引下標
          private int nextChar;
    
          public CoustomerBufferReader(Reader in) {
              this.in = in;
          }
    
          public int read() throws IOException {
              if (nChars == 0) {//表示緩沖中沒有可讀的字符
                  //讀取節(jié)點流(字符流)中數(shù)據(jù)到緩沖數(shù)組中
                  nChars = in.read(buffer);
                  nextChar = 0;
              }
              if (nChars < 0) {//判斷是否讀取末尾
                  return -1;
              }
              int num = buffer[nextChar++];//從緩沖數(shù)組中獲取一個字符
              nChars--;//讀一輪规揪,減一個
              return num;
          }
    
          public String readLine() throws IOException {
              int num = -1;
              StringBuilder builder = new StringBuilder();
              while ((num = read()) != -1) {
                  if (num == '\r') {
                      continue;
                  } else if (num == '\n') {
                      return builder.toString();
                  }
                  builder.append((char) num);//將讀取的一個字符存放到變量中
              }
              //防止最后一行不存在換行符時,無法讀取最后一行
              if (builder.length() > 0)
                  return builder.toString();
    
              return null;
          }
    
      }
    
  • 測試類

      public class Demo{
    
          public static void main(String[] args) {
              try {
                  //讀取Demo6中的內(nèi)容
                  FileReader reader = new FileReader(Demo7.PATH);
                  //使用自己的CoustomerBufferReader
                  CoustomerBufferReader bufferReader=new CoustomerBufferReader(reader);
                  String line=null;
                  while ((line=bufferReader.readLine())!=null){
                      System.out.println(line);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
    
結(jié)果

緩沖字符輸入温峭,輸出流復制文件案例

講道理正長是這樣寫

    public class Demo {
        //拷貝源文件
        public static final String PATH = "/Volumes/huang/studyfromGitHub/JavaForAndroid/JavaForAndroid/series10/src/main/java/com/example/Demo6.java";
        public static final String NAME = "testDemo9.java";

        public static void main(String[] args) {
            FileReader reader = null;
            BufferedReader bufferedReader = null;

            FileWriter fileWriter = null;
            BufferedWriter bufferedWriter = null;

            try {
                reader = new FileReader(PATH);
                bufferedReader = new BufferedReader(reader);

                fileWriter = new FileWriter(Config.PATH + NAME);
                bufferedWriter = new BufferedWriter(fileWriter);
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    //讀一行猛铅,寫一行
                    bufferedWriter.write(line);
                    bufferedWriter.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bufferedReader.close();
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

運行一看結(jié)果,傻眼了:



它一行寫到死。這可不行凤藏,我們看一下奸忽,除了沒換行,其他都對揖庄,那我們控制它換行就可以了栗菜。

  • 完美版 核心代碼替換

          boolean isFirstLine=true;//剛開始絕B第一行
          while ((line = bufferedReader.readLine()) != null) {  //讀一行,寫一行
             if (isFirstLine){//第一行直接寫
                 bufferedWriter.write(line);
                  isFirstLine=false;//寫完之后絕B不是第一行了
              }else {
                  bufferedWriter.newLine();//插入換行
                 bufferedWriter.write(line);
              }
                bufferedWriter.flush();
           }
    
  • 運行結(jié)果


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹄梢,一起剝皮案震驚了整個濱河市疙筹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禁炒,老刑警劉巖而咆,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異幕袱,居然都是意外死亡暴备,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門凹蜂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馍驯,“玉大人,你說我怎么就攤上這事玛痊√保” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵擂煞,是天一觀的道長混弥。 經(jīng)常有香客問我,道長对省,這世上最難降的妖魔是什么蝗拿? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蒿涎,結(jié)果婚禮上哀托,老公的妹妹穿的比我還像新娘。我一直安慰自己劳秋,他們只是感情好仓手,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布胖齐。 她就那樣靜靜地躺著,像睡著了一般嗽冒。 火紅的嫁衣襯著肌膚如雪呀伙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天添坊,我揣著相機與錄音剿另,去河邊找鬼。 笑死贬蛙,一個胖子當著我的面吹牛雨女,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播速客,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼戚篙,長吁一口氣:“原來是場噩夢啊……” “哼五鲫!你這毒婦竟也來了溺职?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤位喂,失蹤者是張志新(化名)和其女友劉穎浪耘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塑崖,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡七冲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了规婆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澜躺。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抒蚜,靈堂內(nèi)的尸體忽然破棺而出掘鄙,到底是詐尸還是另有隱情,我是刑警寧澤嗡髓,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布操漠,位于F島的核電站,受9級特大地震影響饿这,放射性物質(zhì)發(fā)生泄漏浊伙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一长捧、第九天 我趴在偏房一處隱蔽的房頂上張望嚣鄙。 院中可真熱鬧,春花似錦串结、人聲如沸哑子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赵抢。三九已至剧蹂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烦却,已是汗流浹背宠叼。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留其爵,地道東北人冒冬。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像摩渺,于是被迫代替她去往敵國和親简烤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容