淺談緩沖字符流 BufferedReader BufferedWriter用法

緩沖字符流BufferedReader和BufferedWriter

問題:

之前的文件讀寫都是按照字節、字符或者數組來實現的,對於文本文件而言,能否按照行,一行行讀寫呢。

提供瞭BufferedReader和BufferedWriter實現按行讀寫

package com.bjsxt.ios3;
import java.io.*;
public class TestBufferedReaderWriter {
    public static void main(String[] args) throws IOException {
        //1.創建流
        BufferedReader br =
                new BufferedReader(new FileReader("c:/RecorderSDKLog.txt"));
        BufferedWriter bw =
                new BufferedWriter(new FileWriter("c:/RecorderSDKLog2.txt"));

        //2.使用流
        String str = br.readLine();
        while(str != null){
            //輸出當前行數據
            System.out.println(str);
            //寫當前行數據到文件
            bw.write(str);
            //bw.write("\n");
            bw.newLine();
            //再讀一行
            str = br.readLine();
        }
        //3.關閉流
        br.close();
        bw.close();
    }
}

總結1:BufferedReader和BufferedWriter的優點

1.速度快

2.簡化編程

總結2:readLine()底層的原理

底層還是一個一個字符的讀取,append()放入到StringBuilder(或者char[] )中,遇到換行符 ,將StringBuilder(char[])轉換成String並返回

總結3:不同的操作系統中換行符是不同的

Unix系統裡,每行結尾隻有“<換行>”,即“\n”;

Windows系統裡面,每行結尾是“<回車><換行>”,即“\r\n”;

Mac系統裡,每行結尾是“<回車>”,即“\r”。

BufferedReader和BufferedWriter 性能較好的原因

原理:

BufferedReader會一次性從物理流中讀取8k(默認數值,可以設置)字節內容到內存,如果外界有請求,就會到這裡存取,如果內存裡沒有才到物理流裡再去讀。即使讀,也是再8k。

而直接讀物理流,是按字節來讀。

對物理流的每次讀取,都有IO操作。IO操作是最耗費時間的。

BufferedReader就是減少瞭大量IO操作,而為你節省瞭時間。

簡單的說,一次IO操作,讀取一個字節也是讀取,讀取8k個字節也是讀取,兩者花費時間相差不多。而一次IO的來回操作卻要耗費大量時間。

好比是一輛大型汽車(設裝100人),要去車站接人到公司,接一個人也是接,接100個人也是接,而時間一樣。顯然,接100個人最劃算。

物理流就是一次一個字節(一個人)

Buffered就是一次8k個字節(100個人)

對於讀取定長字節文件,當然BufferedReader更快瞭!

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: