1. 程式人生 > 其它 >java基礎知識回顧之javaIO類---BufferedReader和BufferedWriter

java基礎知識回顧之javaIO類---BufferedReader和BufferedWriter

使用了裝飾設計模式:此類的設計是為了提高流操作資料的效率。思想就是定義容器將資料進行臨時儲存,對於緩衝區物件,其實就是將這個容器進行了分裝,並提供了更高效的操作方法。

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();
    }
}