緩衝區流講解(Buffered)

什麼是緩衝區?

緩衝流,也叫高效流,是對4個基本的File流的增強,所以也是4個流,按照資料型別分類:

  • 位元組緩衝流:BufferedInputStream,BufferedOutputStream
  • 字元緩衝流:BufferedReader,BufferedWriter

緩衝流的基本原理,是在建立流物件時,會建立一個內建的預設大小的緩衝區陣列,通過緩衝區讀寫,減少系統IO次數,從而提高讀寫的效率。

緩衝技術的原理?

載入過程

整個過程可以形容成一個快遞小哥,開始時候自行車送快遞,一趟只能送一個,但是後來老闆看他們太幸苦了,給他們配備了一輛五菱巨集光,一次可以送好幾十個,這就大大提高了效率。

緩衝區流採用裝飾者模式去包裝檔案流跟字元流

位元組流緩衝區

BufferedInputStream

Java BufferedInputStream類用於從流中讀取資訊。它內部使用緩衝機制來提高效能。BufferedInputStream的要點是:

  • 當跳過或讀取流中的位元組時,內部緩衝區會自動從包含的輸入流中重新填充,每次填充許多位元組。

  • 建立BufferedInputStream時,會建立一個內部緩衝區陣列。

建構函式:

建構函式 說明
BufferedInputStream(InputStream IS) 它建立新的緩衝輸出流,用於將資料寫入指定的輸出流。
BufferedInputStream(InputStream IS, int size) 建立新的緩衝輸出流,用於將資料寫入具有指定緩衝區大小的指定輸出流。

方法:

方法 說明
int available() 它將指定的位元組寫入緩衝輸出流。
int read() 它從給定的偏移量開始,將指定位元組輸入流中的位元組寫入指定的位元組陣列
int read(byte[] b, int off, int ln) 重新整理緩衝區
void close() 重新整理緩衝區
void reset() 重新整理緩衝區
long skip(long x) 重新整理緩衝區

BufferedOutputStream

Java BufferedOutputStream類用於緩衝輸出流。它在內部使用緩衝區來儲存資料。與直接將資料寫入流相比,它提高了效率。因此,它使效能快速。要在OutputStream中新增緩衝區,請使用BufferedOutputStream類。讓我們看看在OutputStream中新增緩衝區的語法:

建構函式:

建構函式 說明
BufferedOutputStream(OutputStream os) 它建立新的緩衝輸出流,用於將資料寫入指定的輸出流。
BufferedOutputStream(OutputStream os, int size) 建立新的緩衝輸出流,用於將資料寫入具有指定緩衝區大小的指定輸出流。

方法:

方法 說明
void write(int b) 它將指定的位元組寫入緩衝輸出流。
void write(byte[] b, int off, int len) 它從給定的偏移量開始,將指定位元組輸入流中的位元組寫入指定的位元組陣列
void flush() 重新整理緩衝區

字元流緩衝區

BufferedWriter

Java BufferedWriter類用於為Writer例項提供緩衝。寫入速度很快。繼承Writer類。緩衝字元用於提供對單個數組、字元和字串的有效寫入。

建構函式:

建構函式 說明
BufferedWriter(Writer wrt) 它用於建立使用輸出緩衝區的預設大小的緩衝字元輸出流。
BufferedWriter(Writer wrt, int size) 它用於建立使用指定大小的輸出緩衝區的緩衝字元輸出流。

方法:

方法 說明
void newLine() 通過編寫行分隔符來新增新行。
void write(int c) 用於寫入單個字元。
void write(char[] cbuf, int off, int len) 用於寫入字元陣列的一部分
void write(String s, int off, int len) 用於寫入字串的一部分。
void flush() 重新整理輸入流。|
void close() 關閉緩衝區。

BufferedReader

Java BufferedReader類用於從基於字元的輸入流中讀取文字。可以通過readLine()方法逐行讀取資料。讀取速度很快。繼承了Reader類。

建構函式:

建構函式 說明
BufferedReader(Reader rd) 它用於建立使用輸入緩衝區的預設大小的緩衝字元輸出流。
BufferedReader(Reader rd, int size) 它用於建立使用指定大小的緩衝區的緩衝字元輸入流。

方法:

方法 說明
int read() 讀取一個位元組。
int read(char[] cbuf, int off, int len) 用於將字元讀入陣列的一部分。
boolean markSupported() 用於測試輸入流對標記和重置方法的支援。
String readLine() 用於讀取一行文字。
boolean ready() 用於測試輸入流是否準備好讀取。|
long skip(long n) 跳過位元組數
boolean ready() 用於測試輸入流是否準備好讀取。
void reset() 它將流重新定位到上次在此輸入流上呼叫mark方法的位置。
void mark(int readAheadLimit) 用於標記流中的當前位置。
void close() 它關閉輸入流並釋放與該流關聯的任何系統資源。

實戰

讀取檔案內容然後寫入另外一個檔案

位元組緩衝區流

 public static void main(String[] args) {
        //建立一個位元組流,用於讀取當前目錄下的source資料夾中的壓縮檔案
        InputStream in = new FileInputStream("/home/lumeng/practise_lum/uml_tmp_file.rar");
        //建立一個檔案位元組輸出流,用於將讀取的資料寫入test目錄
        OutputStream out = new FileOutputStream("/home/lumeng/practise_lum/test/uml_tmp_file.rar");
        byte[] buff = new byte[1024];  //定義一個位元組陣列,作為緩衝區
        int len; //定義一個int型別的變數len,記住每次讀取的一個位元組
        long begintime = System.currentTimeMillis();//獲取拷貝檔案前的系統時間
        while ((len = in.read(buff)) != -1) { //讀取一個位元組並判斷是不是讀到檔案結尾
            out.write(buff, 0, len);//從第一個位元組開始,向檔案寫入len個位元組
        }
        long endtime = System.currentTimeMillis();//獲取檔案拷貝結束時的系統時間
        System.out.println("拷貝檔案所消耗的時間是:" + ((endtime - begintime) / 1000) + "秒");
        in.close();
        out.close();
    }

在拷貝的過程中,使用while迴圈語句,逐漸實現位元組檔案的拷貝,每迴圈一次,就從檔案讀取若干位元組填充位元組陣列,並通過len記住讀入陣列的位元組數,然後從陣列的第一個位元組開始,將len位元組依次寫入檔案。迴圈往復,當len的值為-1時,說明已經讀到了檔案的末尾,迴圈結束,整個拷貝過程結束。我們可以看出這種操作比單純位元組留拷貝快很多。

字元緩衝區流

 public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("D:\\b.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\b.txt"));

        String len =null;
        while ((len = br.readLine())!=null){//注意此處readLine的預設值是null區別read()
            bw.write(len);
             //bw.write("\r\n");  原先手動新增換行
            bw.newLine();      // 呼叫換行方法
        }
        br.close();
        bw.close();
    }

識別下方二維碼!回覆: 入群 ,掃碼加入我們交流群!

點贊是認可,在看是支援