日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

day19(中)_IO流3(模拟缓冲区,装饰设计模式)

發(fā)布時(shí)間:2023/12/9 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day19(中)_IO流3(模拟缓冲区,装饰设计模式) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

1.MyBufferedReader和MyBufferedInputStream

1.模擬字符讀取流的緩沖區(qū):

/*根據(jù)readLine原理:自定義一個(gè)類包含一個(gè)功能和readLine一致的方法來(lái)模擬以下BufferedReader方法 */ package myreadline; import java.io.FileReader; import java.io.IOException;class MyBufferedReader{private FileReader r;//需要用到FileReader的read方法,因此初始化時(shí)傳入FileReader對(duì)象private char[] chArr=new char[1024];private int pointer=0;MyBufferedReader(FileReader r){this.r=r;}//自定義readLine方法public String readLine()throws IOException{//自定義功能不在內(nèi)部處理,而是拋出去,讓調(diào)用者處理 StringBuilder sb=new StringBuilder();//定義一個(gè)臨時(shí)容器模擬緩沖區(qū)int ch=0;while((ch=r.read())!=-1){if(ch=='\r') continue;//讀下一個(gè)進(jìn)行判斷elseif(ch=='\n')return sb.toString();elsesb.append((char)ch);} /* ①以上代碼也不可寫成 if(ch==’\r’||ch==’\n’) returnsb.toString() 因?yàn)楫?dāng)讀到'\r’ 立即返回改行數(shù)據(jù), 但是下次會(huì)讀'\n’ 會(huì)再次返回,此時(shí)StringBuilder無(wú)數(shù)據(jù) ②如果當(dāng)前平臺(tái)的換行為'\r’以上方法并不適用 以上方法僅適用與\r\n或\n換行 此時(shí)直接 if(ch==’\r’) return sb.toString(); else return sb.append((char)ch); 對(duì)于以上代碼可能發(fā)生一種情況:當(dāng)讀到文件最后一行:例如:abcd后面沒(méi)有回車,此時(shí)執(zhí)行不到sb.toString(),也就是說(shuō):雖然存入容器但是這一行不能返回. 那么加上一個(gè)判斷(如下): */if(sb.length()!=0)return sb.toString(); return null;//此時(shí)讀到文件末尾 }//模擬自定義緩沖區(qū),把關(guān)閉單獨(dú)封裝在一個(gè)方法中public void myClose()throws IOException{r.close();}public static void main(String[] args){MyBufferedReader mbr=null;try{mbr=new MyBufferedReader(new FileReader("4_MyBufferedReader.java"));String line=null;while((line=mbr.readLine_2())!=null)System.out.println(line);}catch(IOException e){throw new RuntimeException("讀異常");}finally{try{if(mbr!=null)mbr.myClose();}catch(IOException e){throw new RuntimeException("關(guān)閉異常");}}} }

?

/* 如果不利用StringBuilder而利用 字符數(shù)組 */ public String readLine_2()throws IOException{pointer=0;int ch=0;while((ch=r.read())!=-1){if(ch=='\r')continue;elseif(ch=='\n')return new String(chArr,0,pointer);elsechArr[pointer++]=(char)ch; }if(pointer!=0)return new String(chArr,0,pointer);return null; }

2.模擬字節(jié)讀取流緩沖區(qū):

/* 自定義緩沖區(qū):算法思想:參照示意圖 */ package mybuffered; import java.io.InputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io. BufferedOutputStream; class MyBufferedInputStream{private byte[] buff=new byte[1024];private InputStream is=null;private int pointer=0;//指針用于取出緩沖區(qū)(數(shù)組)中的元素private int count=0;//計(jì)數(shù)器用于記錄每次從文件中取出的字節(jié)數(shù) MyBufferedInputStream(InputStream is){this.is=is;}public int myBufferedRead()throws IOException{if(count==0){//只有當(dāng)緩沖區(qū)中的數(shù)據(jù)被讀完時(shí),再?gòu)奈募?/span>//取一部分?jǐn)?shù)據(jù)count=is.read(buff);pointer=0;//當(dāng)count==0,把指針重新移到0角標(biāo) }if(count!=-1){//是否到達(dá)文件尾--count;//讀取一個(gè)字節(jié),count-1return (int)buff[pointer++] & 255;//0x00ff }elsereturn -1;}public void close()throws IOException{is.close();} }class TestBuffered{public static void main(String[] args)throws IOException{ //用自定義緩沖區(qū)拷貝MP3 MyBufferedInputStream mbis=new MyBufferedInputStream(new FileInputStream("e:\\song\\Amy Diamond - Heartbeats.mp3"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("c:\\Hertbeats.mp3"));long start=System.currentTimeMillis();int aByte=0;System.out.println(aByte=(mbis.myBufferedRead())); while((aByte=(mbis.myBufferedRead()))!=-1){//從自定義緩沖區(qū)中讀一個(gè)字節(jié),寫入到系統(tǒng)的緩沖區(qū) bos.write(aByte);bos.flush();}long end=System.currentTimeMillis();System.out.println(end-start+"ms");//時(shí)間的長(zhǎng)短和cpu性能以及其它因素有關(guān) bos.close();mbis.close();} }

2.裝飾設(shè)計(jì)模式:

①概述:

/* 裝飾設(shè)計(jì)模式:(目前學(xué)的第三種設(shè)計(jì)模式) 當(dāng)想要對(duì)已有的對(duì)象進(jìn)行功能增強(qiáng)時(shí)可以定義類,將已有對(duì)象(new FileReader)傳入,基于已有的功能(read),并提供加強(qiáng)功能(myReadLine).那么自定義的該類成為裝飾類.裝飾類通常會(huì)通過(guò)構(gòu)造方法接收被裝飾的對(duì)象 并基于被裝飾的對(duì)象的功能,提供更強(qiáng)的功能*/ //例如:增強(qiáng)人的吃飯功能 class Person{public void eat(){System.out.println("吃飯");} } class SuperPerson{private Person p;SuperPerson(Person p){this.p=p;}public void superEat(){System.out.println("喝小酒");p.eat();System.out.println("甜點(diǎn)");System.out.println("整一根");} } class PersonDemo{public static void main(String[] args){Person p=new Person(); p.eat();new SuperPerson(p).superEat();} } /*到目前為止已經(jīng)學(xué)到3中設(shè)計(jì)模式:1.單例設(shè)計(jì)模式2.模板方法設(shè)計(jì)模式3.裝飾設(shè)計(jì)模式 */

②※裝飾相對(duì)繼承優(yōu)點(diǎn):

/*在人吃飯例子中,可以不用裝飾類,我直接讓SuperPerson extends Person,然后復(fù)寫eat方法不也OK?在舉例說(shuō)明為什么要有裝飾設(shè)計(jì)模式?//MyTextReader類用來(lái)操作文件讀取,為了提高讀操作效率,使用緩沖區(qū)技術(shù)//又定義一個(gè)類MyBufferedTextReader繼承它,提供更高效的readLine方法MyReader <--MyTextReader<--MyBufferedTextReader<--MyMediaReader<--MyBufferedMediaReader//讀取多媒體文件,然后為了提高讀效率,使用緩沖區(qū)<--MyDataReader<--MyBufferedDataReader//同理...... 那么,我后期在來(lái)個(gè)類用于操作讀取其它文件,為了高效還得定義緩沖區(qū)子類,產(chǎn)生一些缺點(diǎn):1.使整個(gè)體系變得異常冗雜2.后期的擴(kuò)展性極差那么干脆:找到其參數(shù)的共同類型.通過(guò)多態(tài)形式.可以提高擴(kuò)展性MyBufferedReader extends MyReader{private MyReader mr;pubic MyBufferedReader(MyReader mr){//MyReader的子類對(duì)象均能傳入this.mr=mr; //誰(shuí)需要使用緩沖技術(shù),把它傳進(jìn)來(lái)}}簡(jiǎn)化了原有體系結(jié)構(gòu):MyReader<--MyTextReader<--MyMediaReader<--MyDataReader <--MyBufferedReader*//* 裝飾設(shè)計(jì)模式對(duì)比繼承:1.裝飾設(shè)計(jì)模式比繼承更加靈活提高擴(kuò)展性,避免了繼承的冗雜而且降低了類與類之間關(guān)系2.裝飾類因?yàn)樵鰪?qiáng)已有對(duì)象,具備的功能和已有的功能是相同的只不過(guò)提供了更強(qiáng)的功能(這個(gè)功能是原有的增強(qiáng),而不是從本質(zhì)上改變?cè)泄δ?在Reader體系中,例如:裝飾類BufferedReader,其中readLine就是增強(qiáng)了FileReader中read功能)那么裝飾類和被裝飾類通常是同屬于一個(gè)體系(具有共同的父類/父接口) */

?

鑒于以上我們可以把自定義緩沖區(qū)的代碼優(yōu)化下: (改進(jìn)自定義字符讀取流緩沖區(qū))

//把MyBufferedReader修改為裝飾類: package myreadline; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class MyBufferedReader2 extends Reader{//繼承Reader,那么必須復(fù)寫Reader中抽象方法,不然無(wú)法創(chuàng)建對(duì)象 private Reader r; public MyBufferedReader2(Reader r){//多態(tài)提高擴(kuò)展性this.r=r; }public String readLine()throws IOException{StringBuilder sb=new StringBuilder();int ch=0;while((ch=r.read())!=-1){if(ch=='\r') continue;//讀下一個(gè)進(jìn)行判斷elseif(ch=='\n')return sb.toString();elsesb.append((char)ch);} if(sb.length()!=0)return sb.toString(); return null; }//復(fù)寫close方法public void close()throws IOException{r.close();}//復(fù)寫abstract int read(char[] cbuf, int off, int len)public int read(char[] cbuf, int off, int len)throws IOException{return r .read(cbuf,off,len);//利用了 傳入對(duì)象已復(fù)寫該方法 }public static void main(String[] args){MyBufferedReader mbr=null;try{mbr=new MyBufferedReader(new FileReader("4_MyBufferedReader.java"));String line=null;while((line=mbr.readLine())!=null)System.out.println(line);}catch(IOException e){throw new RuntimeException("讀異常");}finally{try{if(mbr!=null)mbr.close();}catch(IOException e){throw new RuntimeException("關(guān)閉異常");}}} }

3.BufferedReader子類LineNumberReader(相對(duì)于BufferedReader提供更強(qiáng)功能)

①.LineNumberReader示例:

/* 在BufferedReader下有一個(gè)子類:LineNumberReader跟蹤行號(hào)的緩沖字符輸入流,進(jìn)一步加強(qiáng)功能.打印每行的同時(shí)可以帶上行號(hào) */ package bufferedreader; import java.io.LineNumberReader; import java.io.FileReader; import java.io.IOException; class LineNumberReaderDemo{public static void main(String[] args){LineNumberReader lnr=null;try{lnr=new LineNumberReader(new FileReader("7_LineNumberReader.java"));String line=null;lnr.setLineNumber(10);//那么行號(hào)將從11開(kāi)始while((line=lnr.readLine())!=null)System.out.println(lnr.getLineNumber()+":"+line);}catch(IOException e){e.printStackTrace();}finally{try{if(lnr!=null)lnr.close();}catch(IOException e){e.printStackTrace();}}} }

②自定義MyLineNumberReader方法:

package mylinenumber;import java.io.Reader; import java.io.FileReader; import java.io.IOException; import myreadline.MyBufferedReader2;class MyLineNumberReader extends MyBufferedReader2{//在MyBufferedReader2已有方法,不再重復(fù)定義private int lineNumber=0;//行號(hào)public MyLineNumberReader(Reader r){super(r);}//設(shè)置行號(hào)public void mySetLineNumber(int lineNumber){this.lineNumber=lineNumber;}//獲取行號(hào)public int myGetLineNumber(){return lineNumber; }public String myReadLine()throws IOException{++lineNumber;//讀一行自增一次return super.readLine();//提高代碼重用性 }}class MyLineNumberDemo{public static void main(String[] args){MyLineNumberReader mlnr=null;try{mlnr=new MyLineNumberReader(new FileReader("8_MyLineNumberReader.java"));String line=null;mlnr.mySetLineNumber(100);while((line=mlnr.myReadLine())!=null)System.out.println(mlnr.myGetLineNumber()+":"+line);}catch(IOException e){e.printStackTrace();}finally{try{if(mlnr!=null)mlnr.close();}catch(IOException e){e.printStackTrace();}}} }

轉(zhuǎn)載于:https://www.cnblogs.com/yiqiu2324/archive/2013/05/18/3085750.html

總結(jié)

以上是生活随笔為你收集整理的day19(中)_IO流3(模拟缓冲区,装饰设计模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人精品二区三区99精品 | 色国产视频| 黄色av网站在线免费观看 | 日本午夜一区二区三区 | 欧美怡红院 | www.久久av.com | 2018天天干天天操 | 国产天堂网 | av网在线播放 | 亚洲精品aaa | jizz一区二区三区 | 国产原创视频 | 亚洲aaaa级特黄毛片 | 欧美激情一区二区三区在线 | 亚洲第一视频网站 | 色悠久久久 | 欧美久久久| 色婷婷六月天 | 视频精品久久 | 狠狠爱免费视频 | 日本超碰在线 | 激情内射人妻1区2区3区 | 日韩精品第二页 | 你懂的在线观看视频 | 欧美变态另类刺激 | 国产精品自拍亚洲 | 欧美久久久影院 | 国产精品一区二区精品 | 亚洲黄色网址大全 | 美女一级片 | 中国挤奶哺乳午夜片 | 综合色88 | 久久精品免费一区二区 | 丰满熟妇被猛烈进入高清片 | 亚洲高清在线观看视频 | 国产精品久久久久久亚洲伦 | 秋霞影院一区二区 | 国产aa| 久久久久久久久久久久Av | 亚洲综合在线成人 | 午夜精品久久久久久久无码 | 色性网| 国产成人视屏 | 黑色丝袜吻戏亲胸摸腿 | 日韩黄色av| 可以免费观看av | 欧美精品一区二区性色a+v | 在线视频 中文字幕 | 亚洲精品网站在线 | 九九在线精品视频 | 97狠狠操 | 欧美激情视频网 | 日一区二区三区 | 亚洲精品国| 国产高清无密码一区二区三区 | 伊人超碰 | 91精品又粗又猛又爽 | 泰剧19禁啪啪无遮挡 | av资源免费看 | 欧美妞干网 | 精品国产乱码一区二区三区99 | 色www亚洲国产张柏芝 | 毛片基地免费观看 | 粗大黑人巨茎大战欧美成人 | 亚洲黄色成人网 | 日韩欧美一区二区视频 | 久久久99精品免费观看 | 日本精品视频一区 | 亚洲成人诱惑 | 午夜久久电影 | 影音先锋精品 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 欧美日韩一区二区区 | 国产欧美在线 | 熟妇人妻无码xxx视频 | 国产的av | 激情www | 亚洲AV午夜成人片 | 人妻少妇一区 | 一区二区三区在线免费观看 | 麻豆影视网站 | 国产精品嫩草69影院 | 成人免费一区 | 极品少妇在线观看 | 日本高清在线播放 | 高清一区二区三区 | 一区二区高清在线观看 | 国产乱人伦 | 久久亚洲AV成人无码国产人妖 | 欧美视频一区二区三区四区 | 91黄在线观看| 制服丝袜成人动漫 | 琪琪女色窝窝777777 | 久色视频在线 | 夜夜嗨av一区二区三区四区 | 91在线免费看 | 午夜在线免费观看视频 | av导航网站 | 91成年视频 |