前幾節我們學習了檔案位元組輸入輸出流和檔案字元輸入輸出流,這一節我們學習一個新的概念-緩衝流。那什麼叫緩衝流呢?緩衝流又能起到什麼作用呢?
在Java中,我們把BufferedReader和BufferedWriter類別建立的物件稱為緩衝輸入輸出流,二者增強了讀寫檔案的能力。例如,Sudent.txt就是一個學生名單,每個姓名佔一行。如果我們想要讀取名字,那麼每次必須讀取一行,使用FileReader流很難完成這樣的任務,因為,我們不清楚一行有多少個字符,FileReader類別沒有提供讀取一行的方法。
Java提供了更進階的流:BufferedReader流和BufferedWriter流,二者的來源和目的地必須是字元輸入流和字元輸出流。因此,如果把文件字符輸入流作為BufferedReader流的來源,把文件字符輸出流作為BufferedWriter流的目的地,那麼,BufferedReader和BufferedWriter類創建的流將比字符輸入流和字符輸出流有更強的讀寫能力。例如,BufferedReader流就可以按行讀取文件。
BufferedReader類別和BufferedWriter的建構方法分別是:
BufferedReader(Readerin);BufferedWriter(Writerout);
BufferedReader流能夠讀取文字行,方法是readLine() 。透過向BufferedReader傳遞一個Reader子類的對象,例如FileReader的實例,來建立一個BufferedReader對象,例如:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
然後inTwo流呼叫readLine()方法中讀取Student.txt,例如:
StringstrLine=inTwo.readLine();
類似地,可以將BufferedWriter流和FileWriter流連接在一起,然後使用BufferedWriter流將資料寫到目的地,例如:
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
然後out使用BufferedReader類別的方法write(String s,int off,int len)把字串s寫到hello.txt中,參數off是s開始處的偏移量,len是寫入的字元數。
另外,BufferedWriter流有一個獨特的向文件寫入一個回行符的方法:
newLine();
可以把BufferedReader和BufferedWriter稱為上層流,把它們指向的字元流稱為底層流,Java採用快取技術將上層流和底層流連接。底層字元輸入流首先將資料讀入緩存,BufferedReader流再從快取讀取資料;BufferedWriter流將資料寫入緩存,底層字元輸出流會不斷地將快取中的資料寫入到目的地。當BufferedWriter流呼叫flush()刷新快取或呼叫close()方法關閉時,即使快取沒有溢出,底層流也會立刻將快取的內容寫入目的地。
注意:關閉輸出流時要先關閉緩衝輸出流,然後關閉緩衝輸出流指向的流,即先關閉上層流再關閉底層流。在編寫程式碼時只需關閉上層流,那麼上層流的底層流將自動關閉。
例如:
由英文句子構成的文件english.txt如下,每句佔一行:
Thearrowmissedthetarget.Theyrejectedtheuniondemand.Wheredoesthisroadgoto?
請按行讀取english.txt,並在該行的後面加上該英文句子中所含的單字數目,然後再將該行寫入到一個名字為englishCount.txt的檔案中,程式碼如下:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.rb);try{Writerout=newFiletxtWriter(fWrite=newFile(englishCount.rb);try{Writerout=newFiletxtWriter(fWrite=newFile(englishCount.rb);try{Writerout=newFile newBufferedWriter(out);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null;while((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTocountizer(str. countTokens();str=str+句子中單字個數:+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.close();out.close();in=newFileReader(fWrite);bufferRead =newBufferedReader(in);Strings=null;System.out.println(fWrite.getName()+內容:);while((s=bufferRead.readLine())!=null){System.out.println(s) ;}bufferRead.close();in.close();}catch(IOExceptione){System.out.println(e.toString());}}}
運行結果如下:
englishCount.txt內容:Thearrowmissedthetarget.句子中單字數:5Theyrejectedtheuniondemand.句子中單字數:5Wheredoesthisroadgoto?句子中單字數:6