緩衝區流講解(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();
}
識別下方二維碼!回覆:
入群
,掃碼加入我們交流群!
點贊是認可,在看是支援