天天看點

java檔案操作中的幾個流的關系(3)

在(2)中我們講了檔案操作的基本的四個流,這篇文章中我們來了解下檔案操作的幾個增強流。

  1. 為什麼要使用增強流

    前面的幾個基本的流,雖然可以讀一定數組長度的檔案,但是在日常中,我們一般都是一行一行的讀寫,而且每一行資料的多少也不一定能保證都一樣,是以這個時候再使用這幾個基本的流已經不能再滿足我們的需求了,于是就産生了增強流這個東西。

  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。

  1. 增強流的使用

    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

繼續閱讀