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

目錄:系統(tǒng)學習 Java IO---- 目錄煌妈,概覽

BufferedReader

BufferedReader 類構造器接收一個 Reader 對象儡羔,為 Reader 實例提供緩沖。 緩沖可以加快 IO 的速度璧诵。 BufferedReader 不是一次從網絡或磁盤讀取一個字符汰蜘,而是一次讀取一個更大的塊。 這通常要快得多腮猖,特別是對于磁盤訪問和更大的數據量鉴扫。

類似于 BufferedInputStream ,主要區(qū)別在于 BufferedReader 讀取字符(文本)澈缺,而 BufferedInputStream 讀取原始字節(jié)。

除了向Reader實例添加緩沖外炕婶,BufferedReader 的行為與 Reader 非常相似姐赡。 BufferedReader 有一個額外的方法,即 readLine() 方法柠掂。 如果您需要一次讀取一行輸入项滑,則此方法很方便。
String line = bufferedReader.readLine();

BufferedWriter

BufferedWriter 類構造器接收一個 Writer 對象涯贞,為 Writer 實例提供緩沖枪狂。 緩沖可以加快 IO 的速度。 BufferedWriter 不是一次寫一個字符到網絡或磁盤宋渔,而是一次寫一個更大的塊州疾。 這通常要快得多,特別是對于磁盤訪問和更大的數據量皇拣。

可以包裝 FileReader 的 BufferedReader 严蓖。 BufferedReader 將從 FileReader 讀取一個字符塊(通常為 char 數組)。 因此氧急,從 read() 返回的每個字符都從此內部數組返回颗胡。 當數組被讀完時,BufferedReader 將一個新的數據塊讀入數組等吩坝。

可以設置 BufferedReader/BufferedWriter 在內部使用的緩沖區(qū)大小毒姨。默認大小是 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 適用于字節(jié)。所以請參考前面的文章邓嘹,不再贅述了酣栈。下面提供一個簡單的例子:

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); // 推回操作都是將內容復制到推回緩沖區(qū)的前面
        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 是用于實現(xiàn)自己的過濾閱讀器的基類。 基本上它只是覆蓋了 Reader 中的所有方法寇甸。
與 FilterInputStream 一樣塘偎,我認為這個類沒有明智的目的。 我無法看到這個類實際上添加或更改了 Reader 中的任何行為拿霉,只是它在構造函數中需要一個 Reader 吟秩。 如果想選擇擴展此類,則可以直接擴展 Reader 類绽淘,并避免層次結構中的額外類涵防。FilterWriter 同樣。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壮池,隨后出現(xiàn)的幾起案子偏瓤,更是在濱河造成了極大的恐慌,老刑警劉巖椰憋,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厅克,死亡現(xiàn)場離奇詭異,居然都是意外死亡橙依,警方通過查閱死者的電腦和手機证舟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗骑,“玉大人女责,你說我怎么就攤上這事〈匆耄” “怎么了抵知?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長软族。 經常有香客問我刷喜,道長,這世上最難降的妖魔是什么立砸? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任吱肌,我火速辦了婚禮,結果婚禮上仰禽,老公的妹妹穿的比我還像新娘。我一直安慰自己纺蛆,他們只是感情好吐葵,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桥氏,像睡著了一般温峭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上字支,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天凤藏,我揣著相機與錄音,去河邊找鬼堕伪。 笑死揖庄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的欠雌。 我是一名探鬼主播蹄梢,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼富俄!你這毒婦竟也來了禁炒?” 一聲冷哼從身側響起而咆,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幕袱,沒想到半個月后暴备,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡们豌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年涯捻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛痊。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡汰瘫,死狀恐怖,靈堂內的尸體忽然破棺而出擂煞,到底是詐尸還是另有隱情混弥,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布对省,位于F島的核電站蝗拿,受9級特大地震影響,放射性物質發(fā)生泄漏蒿涎。R本人自食惡果不足惜哀托,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劳秋。 院中可真熱鬧仓手,春花似錦、人聲如沸玻淑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补履。三九已至添坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫锤,已是汗流浹背贬蛙。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谚攒,地道東北人阳准。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像五鲫,于是被迫代替她去往敵國和親溺职。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容

  • 概述 java.io 包幾乎包含了所有操作輸入、輸出需要的類浪耘。所有這些流類代表了輸入源和輸出目標乱灵。java.io ...
    Steven1997閱讀 9,183評論 1 25
  • 概述: 1、IO流:即Input Output的縮寫七冲。 2痛倚、特點:1)IO流用來處理設備間的數據傳輸。2)Java...
    玉圣閱讀 1,241評論 0 3
  • 一澜躺、IO流整體結構圖 流是一組有順序的蝉稳,有起點和終點的字節(jié)集合,是對數據傳輸的總稱或抽象掘鄙。即數據在兩設備間的傳輸稱...
    慕凌峰閱讀 1,153評論 0 12
  • (一) 雨下得很大耘戚,路上行人蹤跡難覓。 在我左手邊一百米有一個驛站操漠,里面有三個守衛(wèi)收津,驛站外的馬槽有一匹馬。 馬槽距...
    王慕川閱讀 458評論 24 13
  • 皮亞杰說:“兒童思維是從動作開始的,切斷動作與思維的聯(lián)系嚣鄙,思維就得不到發(fā)展;智慧的鮮花是開在手上的”吻贿。動手操...
    檸檬非酸閱讀 959評論 0 0