1. 程式人生 > >系統學習 Java IO (十四)----字元讀寫快取和回退 BufferedReader/BufferedWriter & PushbackReader

系統學習 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 同樣。