在(2)中我們講了檔案操作的基本的四個流,這篇文章中我們來了解下檔案操作的幾個增強流。
-
為什麼要使用增強流
前面的幾個基本的流,雖然可以讀一定數組長度的檔案,但是在日常中,我們一般都是一行一行的讀寫,而且每一行資料的多少也不一定能保證都一樣,是以這個時候再使用這幾個基本的流已經不能再滿足我們的需求了,于是就産生了增強流這個東西。
-
了解增強流的基本概念
增強流是基本流的子類,在他們的基礎上增加了部分功能,比如多了常用的readLine() ,用來讀取一行的内容,我們再看一下兩者構造方法的差別
BufferedReader(Reader in) //建立使用預設大小的輸入緩沖區的緩沖字元輸入流。
BufferedReader(Reader in, int sz) //建立使用指定大小的輸入緩沖區的緩沖字元輸入流。
FileReader(File file) //在給定從中讀取資料的 File 的情況下建立一個新 FileReader。
FileReader(FileDescriptor fd)// 在給定從中讀取資料的 FileDescriptor 的情況下建立一個新 FileReader。
FileReader(String fileName) // 在給定從中讀取資料的檔案名的情況下建立一個新 FileReader。
FileReader構造方法中的參數是檔案,意味着FileReader和最終的資料源相關聯,這樣的流成為底層流
BufferedReader的構造方法中的參數是一個流(BufferedReader比FileReader多出了一個readLine方法),意味着BufferedReader增強了FileReader的功能,這樣的流稱為增強流(或裝飾流、包裝流、進階流),增強流和底層流相關聯。
BufferedReader和BufferedWriter内部自帶了緩沖區(字元數組),預設大小是8k,即8192。
-
增強流的使用
BufferedReader
public class TestBufferedReader { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new FileReader(new File("D:\\a.txt"))); char[] buff = new char[10]; int length = br.read(buff); while(length != -1) { System.out.println(new String(buff,0,length)); length = br.read(buff); } br.close(); } }
對比以前的FileRead
public class TestReadeer {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("D:\\a.txt");
char[] buff = new char[10];
int length = reader.read(buff);
while(length != -1) {
System.out.print(new String(buff,0,length));
length = reader.read(buff);
}
reader.close();
}
}
一眼看上去兩者在代碼層次上都查不多,但是在運作是所進行的操作可大不相同,假設一個檔案大小問N,如果沒有使用BufferedReader,那麼每次讀取10個字元,至少和磁盤上的檔案互動N/10次,當使用了BufferedReader時,每次先讀8K的字元到緩沖數組中,先儲存起來,和檔案互動N/8192次。br.read(buff)實際上不在與檔案打交道,而是讀緩沖數組(記憶體)中的資料,讀記憶體的速度很快。
結論
以後讀取字元檔案時都盡量使用BufferedReader
以後讀取位元組檔案時都盡量使用BufferedInputStream
以後寫字元檔案時都盡量使用 BufferedWriter
以後寫位元組檔案時都盡量使用 BufferedOutputStream