java IO教程《三》

緩衝區流講解(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();
    }

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

點贊是認可,在看是支援點贊是認可,在看是支援

Tags: