<1 IO流(BufferedWriter)>
package day19;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;/** * 緩沖區(qū) 出現(xiàn)時為了提高流的操作效率而出現(xiàn)的 * 所以在創(chuàng)建緩沖區(qū)之前,必須要先有流對象 * * 該緩沖區(qū)中提供了一個跨平臺的換行符:newLine() * 注意:像這樣的方法,都是只有 緩沖區(qū)對象才有的。所以一定要先有緩沖區(qū)對象。 * Created by Administrator on 2017/2/8. */public class BufferedWriterDemo { public static void main(String[] args) throws IOException { //創(chuàng)建一個字符寫入流對象。 FileWriter fw = new FileWriter("buf.txt"); //為了提高字符寫入流效率,加入了緩沖技術(shù). //只要將需要被提高效率的流對象作為參數(shù)傳遞給緩沖區(qū)的構(gòu)造函數(shù)即可. BufferedWriter bufw = new BufferedWriter(fw); for(int x = 1; x < 5; x++){ bufw.write("abcd" + x); bufw.newLine(); bufw.flush(); } //記住,只要用到緩沖區(qū),就要記得刷新。 bufw.flush(); //其實關(guān)閉緩沖區(qū),就是在關(guān)閉緩沖區(qū)中的流對象 bufw.close(); }}<02 IO流(BufferedReader)>package day19;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;/** * 字符讀取流緩沖區(qū) * * 一行一行的讀,是最方便的 * * 該緩沖區(qū)提供了一個一次讀一行的方法readLine(),方便于對文本數(shù)據(jù)的讀取。 * 當(dāng)返回null時,表示讀到文件末尾。 * * readLine方法返回的時候只返回回車符之前的數(shù)據(jù)內(nèi)容。并不返回回車符。 * Created by Administrator on 2017/2/8. */public class BufferedReaderDemo { public static void main(String[] args) throws IOException { //創(chuàng)建一個讀取流對象和文件相關(guān)聯(lián) FileReader fr = new FileReader("buf.txt"); //為了提高效率,加入緩沖技術(shù),將字節(jié)讀取流對象作為參數(shù)傳遞給緩沖對象的構(gòu)造函數(shù) BufferedReader bufr = new BufferedReader(fr);// String s1 = bufr.readLine(); //一行一行的讀// System.out.PRintln(s1); //循環(huán)讀 String line = null; while((line = bufr.readLine()) != null){ System.out.println(line); } }}<03 IO流(通過緩沖區(qū)復(fù)制文本文件)>package day19;import com.sun.org.apache.regexp.internal.RE;import java.io.*;/** * 通過緩沖區(qū)復(fù)制一個.java文件. * Created by Administrator on 2017/2/8. */public class CopyTestByBuf { public static void main(String[] args){ BufferedReader bufr = null; BufferedWriter bufw = null; try { bufr = new BufferedReader(new FileReader("D://code//javacode//src//day19//BufferedWriterDemo.java")); bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt")); String line = null; //中轉(zhuǎn)站(兩種流之間的橋梁) while((line = bufr.readLine()) != null){ bufw.write(line); bufw.newLine(); bufw.flush(); } } catch (IOException e) { throw new RuntimeException("讀寫失敗"); }finally { try { if(bufr != null) bufr.close(); } catch (IOException e) { throw new RuntimeException("讀取關(guān)閉失敗"); } try { if(bufw != null) bufw.close(); }catch(IOException e){ throw new RuntimeException("寫入關(guān)閉失敗"); } } }}<04 readLine的原理>readLine()方法的原理:
無論是讀一行,還是讀取多個字符。其實最終都是從硬盤上一個一個的讀取。
所以最終使用的還是read()方法來一個一個的讀。
只要遇到回車符/n,就表示前面的數(shù)據(jù)是一行。于是會把前面的數(shù)據(jù)一次性的輸出。 (而read()是讀一個 返回一個)
<05 自定義MyBufferedReader>
<06 裝飾設(shè)計模式/裝飾類>
裝飾類的方式:
構(gòu)造函數(shù)的傳遞,基本功能增強。
package day19;/** * 裝飾設(shè)計模式: * 當(dāng)想要對已有的對象進行功能增強時, * 可以定義類,將已有對象傳入,基于已有的功能,并提供加強功能。 * 那么自定義的類稱為裝飾類 * * 裝飾類通常會通過構(gòu)造方法接收被裝飾的對象。 * 并基于被裝飾的對象的功能,提供更強的功能。 * Created by Administrator on 2017/2/9. */class Person{ public void chifan(){ System.out.println("吃飯"); }}class SuperPerson{ private Person p ; SuperPerson(Person p){ this.p = p; } public void superChifan(){ System.out.println("開胃菜"); p.chifan(); System.out.println("甜點"); System.out.println("來一根"); }}public class PersonDemo { public static void main(String[] args){ Person p = new Person(); p.chifan(); }}<07 裝飾和繼承的區(qū)別>(再聽)裝飾更靈活。
不要繼承太多。
/*MyReader//專門用于讀取數(shù)據(jù)的類。 |--MyTextReader |--MyBufferTextReader |--MyMediaReader |--MyBufferMediaReader |--MyDataReader |--MyBufferDataReaderclass MyBufferReader{ MyBufferReader(MyTextReader text) {} MyBufferReader(MyMediaReader media) {}}上面這個類擴展性很差。找到其參數(shù)的共同類型。通過多態(tài)的形式。可以提高擴展性。class MyBufferReader extends MyReader{ private MyReader r; MyBufferReader(MyReader r) {}} MyReader//專門用于讀取數(shù)據(jù)的類。 |--MyTextReader |--MyMediaReader |--MyDataReader |--MyBufferReader以前是通過繼承將每一個子類都具備緩沖功能。那么繼承體系會復(fù)雜,并不利于擴展。現(xiàn)在優(yōu)化思想。單獨描述一下緩沖內(nèi)容。將需要被緩沖的對象。傳遞進來。也就是,誰需要被緩沖,誰就作為參數(shù)傳遞給緩沖區(qū)。這樣繼承體系就變得很簡單。優(yōu)化了體系結(jié)構(gòu)。裝飾模式比繼承要靈活。避免了繼承體系臃腫。而且降低了類于類之間的關(guān)系。裝飾類因為增強已有對象,具備的功能和已有的是相同的,只不過提供了更強功能。所以裝飾類和被裝飾類通常是都屬于一個體系中的。*/class { public static void main(String[] args) { System.out.println("Hello World!"); }}<08 自定義裝飾類>要重寫Reader中的抽象方法。
<09 LineNumberReader>
它里面有個屬性LineNumber,報告對應(yīng)的get和set方法:getLineNumber()、setLineNumber()
package day19;import java.io.*;/** * Created by Administrator on 2017/2/9. */public class LineNumberReader { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("D://code//javacode//src//day19//PersonDemo.java"); java.io.LineNumberReader lnr = new java.io.LineNumberReader(fr); String line = null; lnr.setLineNumber(100); while((line = lnr.readLine()) != null){ System.out.println(lnr.getLineNumber() + ": " + line); } lnr.close(); }}//練習(xí):模擬一個帶行號的緩沖區(qū)對象。
新聞熱點
疑難解答