java基礎知識回顧之javaIO類---BufferedReader和BufferedWriter
阿新 • • 發佈:2021-12-22
使用了裝飾設計模式:此類的設計是為了提高流操作資料的效率。思想就是定義容器將資料進行臨時儲存,對於緩衝區物件,其實就是將這個容器進行了分裝,並提供了更高效的操作方法。
BufferReader:
package com.lp.ecjtu; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferReaderDemo { /** * @param args * @throws IOException * * 該緩衝去提供了一個的讀取一行 readLine()方法,當返回null時讀到末尾 */ public static void main(String[] args) throws IOException { //建立一個讀取流物件和檔案相關聯 FileReader fr = new FileReader("FileReaderDemo.java"); //為了提高字元讀取的效率,加入緩衝技術 //將需要被提高效率的流物件作為引數傳入緩衝區的構造方法即可 BufferedReader bw = new BufferedReader(fr); String line = null; /*line = bw.readLine(); System.out.println("******"+line);//一次性讀取一行 String line1 = bw.readLine(); System.out.println("******"+line1); String line2 = bw.readLine(); System.out.println("******"+line2);*/ while((line=bw.readLine()) != null){ System.out.println(line); } bw.close(); } }
BufferWriter:
package com.lp.ecjtu; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class BufferWriterDemo { /** * @param args * @throws IOException * * 該緩衝去提供了一個跨平臺的換行符 newLine方法 */ public static void main(String[] args) throws IOException { //建立一個字元寫入流物件 FileWriter fw = new FileWriter("buf.txt"); //為了提高字元寫入的效率,加入緩衝技術 //將需要被提高效率的流物件作為引數傳入緩衝區的構造方法即可 BufferedWriter bw = new BufferedWriter(fw); for(int i=0;i<5;i++){ bw.write("abcd"+i); bw.newLine(); bw.flush(); } } }
通過緩衝區將一個文字的內容複製到另一個檔案當中:
package com.lp.ecjtu; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyTextByBuffer { /** * @param args * readLine()方法返回回車符之前資料的內容,並不返回回車符,可以通過newLine()方法換行 */ public static void main(String[] args) { BufferedReader bufr = null; BufferedWriter bufw = null; try { bufr = new BufferedReader(new FileReader("FileReaderDemo.java")); bufw = new BufferedWriter(new FileWriter("bufferWriterCopy.txt")); String line = null; while((line=bufr.readLine())!=null){ bufw.write(line); bufw.newLine(); bufw.flush(); } } catch (FileNotFoundException e) { throw new RuntimeException("沒有找到指定檔案!請確認檔名稱是否正確!"); }catch (IOException e) { throw new RuntimeException("讀寫失敗!"); }finally{ try { if(bufr != null){ bufr.close(); } } catch (IOException e) { throw new RuntimeException("讀取關閉失敗!"); } try { if(bufw != null){ bufw.close(); } } catch (IOException e) { throw new RuntimeException("寫入關閉失敗!"); } } } }
原理;
1,使用流的read方法從源中讀取一批資料儲存到緩衝區的陣列中。
2,通過計數器記錄住儲存的元素個數。
3,通過陣列的角標來獲取陣列中的元素(從緩衝區中取資料).
4,指標會不斷的自增,當增到陣列長度,會歸0.計數器會自減,當減到0時,就在從源拿一批資料進緩衝區。
package com.lp.ecjtu; import java.io.FileReader; import java.io.IOException; class MybufferReader { private FileReader r; public MybufferReader(FileReader r){ this.r = r; } //可以一次性讀一行資料的方法 public String myreadLine() throws IOException{ StringBuilder sb = new StringBuilder(); int ch = 0; 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(); } return null; } public void myClose() throws IOException{ r.close(); } } public class MybufferReaderDemo{ public static void main(String[] args) throws IOException{ FileReader fr = new FileReader("buf.txt"); MybufferReader mybuffer = new MybufferReader(fr); String line = null; while((line =mybuffer.myreadLine())!= null){ System.out.println(line); } mybuffer.myClose(); } }