Java BufferedReader BufferedWriter類源碼解析

BufferedReader

像BufferedInputStream爲FileInputStream提供了緩衝區同樣,BufferedReader爲InputStreamReader提供了緩衝區。通常狀況下,全部的讀取都是先從下層輸入流讀取到緩衝區,而後再從緩衝區讀取到目標數組,除非出現要讀取的長度超過了緩衝區大小且緩衝區沒有有效數據和有效mark,能夠直接從下層輸入流讀取字符。數組

來看一下這個類的頭部註釋:從字符輸入流讀取文本,緩衝字符來提供高效地讀取字符、數組和行。緩衝區的大小多是指定的或者是默認大小,默認大小對於大部分狀況足夠大了。通常來講,Reader的每個讀取請求引發一個下層的字節或者字符輸入流的讀取請求。因此建議用BufferedReader來包裹一個read方法花費大的Reader,好比FileReaders和InputStreamReaders。例如 BufferedReader in = new BufferedReader(new FileReader("foo.in"));將會緩存從特定文件來的輸入。沒有緩衝,每一次調用read()或者readLine()可能引發從文件讀取字節,轉換爲字符後返回,這樣效率不高。使用DataInputStreams進行文本輸入的程序能夠經過替換每個DataInputStream爲合適的BufferedReader進行局部化。緩存

前面已經解釋過爲何能夠經過從文件讀取大塊內容存儲到內存緩衝區來提升總體讀取速度,BufferedReader就是字符緩衝輸入流。它提供了一個字符數組來做爲緩衝區,默認大小是8K,在構造時初始化,fill()方法可能會出現須要從新分配一個更大數組的狀況。從構造函數和內部變量中,咱們能夠看到它也具備內部包裹的下層輸入流而且須要是Reader及其子類。函數

/**
     * 下層輸入流
     */
    private Reader in;
    /**
     * 緩衝區
     */
    private char cb[];
    /**
     * 最後一個有效字符的位置
     */
    private int nChars;
    /**
     * 下一個要讀取的字符位置
     */
    private int nextChar;

    private static final int INVALIDATED = -2;
    private static final int UNMARKED = -1;
    /**
     * 標記的位置,小於等於-1時表明不存在mark
     */
    private int markedChar = UNMARKED;
    private int readAheadLimit = 0; /* 只有markedChar > 0時是有效的 */

    /** 若是下一個字符是換行符,跳過它 */
    private boolean skipLF = false;

    /** 設定mark時skipLF的標記 */
    private boolean markedSkipLF = false;

    private static int defaultCharBufferSize = 8192;
    private static int defaultExpectedLineLength = 80;

    /**
     * 建立一個緩衝字符輸入流使用一個指定大小的輸入緩衝區
     */
    public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];
        nextChar = nChars = 0;
    }

    /**
     * 建立一個緩衝字符輸入流使用一個默認大小8K的輸入緩衝區
     */
    public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }

ensureOpen這個內部方法的做用就是檢查流有沒有被關閉,標誌是下層輸入流爲nullthis

相關文章
相關標籤/搜索