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