系統學習 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 同樣。
系統學習 Java IO (十四)----字符讀寫緩存和回退 BufferedReader/BufferedWriter & PushbackReader