天天看點

系統學習 Java IO (十四)----字元讀寫緩存和回退 BufferedReader/BufferedWriter & PushbackReader

目錄:系統學習 Java IO---- 目錄,概覽

BufferedReader

BufferedReader 類構造器接收一個 Reader 對象,為 Reader 執行個體提供緩沖。 緩沖可以加快 IO 的速度。 BufferedReader 不是一次從網絡或磁盤讀取一個字元,而是一次讀取一個更大的塊。 這通常要快得多,特别是對于磁盤通路和更大的資料量。

類似于 BufferedInputStream ,主要差別在于 BufferedReader 讀取字元(文本),而 BufferedInputStream 讀取原始位元組。

除了向Reader執行個體添加緩沖外,BufferedReader 的行為與 Reader 非常相似。 BufferedReader 有一個額外的方法,即 readLine() 方法。 如果您需要一次讀取一行輸入,則此方法很友善。

String line = bufferedReader.readLine();

BufferedWriter

BufferedWriter 類構造器接收一個 Writer 對象,為 Writer 執行個體提供緩沖。 緩沖可以加快 IO 的速度。 BufferedWriter 不是一次寫一個字元到網絡或磁盤,而是一次寫一個更大的塊。 這通常要快得多,特别是對于磁盤通路和更大的資料量。

可以包裝 FileReader 的 BufferedReader 。 BufferedReader 将從 FileReader 讀取一個字元塊(通常為 char 數組)。 是以,從 read() 傳回的每個字元都從此内部數組傳回。 當數組被讀完時,BufferedReader 将一個新的資料塊讀入數組等。

可以設定 BufferedReader/BufferedWriter 在内部使用的緩沖區大小。預設大小是 8192 的字元數組。

一個簡單的使用執行個體如下:

File file = new File("D:\\test\\1.txt");
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write("string from BufferedWriter");
writer.close();

int bufferSize = 8 * 1024; // 可選的緩沖字元數組大小
BufferedReader reader = new BufferedReader(new FileReader(file), bufferSize);
int data = reader.read();
while (data != -1) {
    System.out.print((char) data); // string from BufferedWriter
    data = reader.read();
}
reader.close();
           

PushbackReader

PushbackReader 類旨在從 Reader 解析資料時使用,它可以包裝一個 Reader 對象。 PushbackReader 允許将讀取的字元推回到 Reader 中下次調用 read() 時,将再次讀取這些字元。通俗來講,PushbackReader 提供了一種可能,讓我們能讀取流的部分内容而不破壞流。

PushbackReader 的工作方式與 PushbackInputStream 非常相似,隻是 PushbackReader 适用于字元,而 PushbackInputStream 适用于位元組。是以請參考前面的文章,不再贅述了。下面提供一個簡單的例子:

PushbackReader pushbackReader = new PushbackReader(new FileReader("c:\\data\\input.txt"));
int data = pushbackReader.read();
pushbackReader.unread(data);
           
設定 PushbackReader 的後推限制

有一個構造函數

public PushbackReader(Reader in, int size)

可以設定 PushbackReader 的後推限制,如果不設定這個值,那預設為 1 ,這個值很重要,表示了最多能往回推多少個字元,如果讀取了 10 個字元,但是後退限制為 1 的話,那總共隻能推回 1 個字元,剩下的 9 個字元沒辦法推回去,流就被破壞了。

一個使用示例如下:

public class PushbackReaderExample {
    public static void main(String[] args) throws IOException {
        int limit = 2; // 可選,最多隻能推回 2 個字元,預設值是 1 
        File file = new File("D:\\test\\1.txt"); // 檔案内容是 123456789
        PushbackReader reader = new PushbackReader(new FileReader(file), limit);
        char[] bytes = new char[9]; // 讀取 9 個字元;
        reader.read(bytes);
        System.out.println(bytes); // 123456789

        reader.unread(97); // 推回操作都是将内容複制到推回緩沖區的前面
        reader.unread(97); // 97 是字元 'a' 的 int 值,推回 2 個 'a'
        // reader.unread(97); // 會失敗并抛出異常,因為最多隻能推回2個字元
        reader.read(bytes);
        System.out.println(bytes); // aa3456789
        reader.close();
    }
}
           
close()

當完成從 PushbackReader 讀取字元後,記得關閉它。 關閉 PushbackReade還将關閉 PushbackReader 正在讀取的 Reader 執行個體。

FilterReader/FilterWriter

FilterReader 是用于實作自己的過濾閱讀器的基類。 基本上它隻是覆寫了 Reader 中的所有方法。

與 FilterInputStream 一樣,我認為這個類沒有明智的目的。 我無法看到這個類實際上添加或更改了 Reader 中的任何行為,隻是它在構造函數中需要一個 Reader 。 如果想選擇擴充此類,則可以直接擴充 Reader 類,并避免層次結構中的額外類。FilterWriter 同樣。

如果覺得本文有所幫助,歡迎點【推薦】!文章錯誤之處煩請留言。

轉載說明:轉載後必須在文章開頭明顯地給出作者和原文連結;引用必須注明出處;需要二次修改釋出請聯系作者征得同意。