天天看點

Java IO: 其他字元流(下)

本小節會簡要概括java io中的pushbackreader,linenumberreader,streamtokenizer,printwriter,stringreader,stringwriter。

<a href="http://tutorials.jenkov.com/java-io/pushbackreader.html">原文連結</a>

pushbackreader與pushbackinputstream類似,唯一不同的是pushbackreader處理字元,pushbackinputstream處理位元組。代碼如下:

同樣可以設定緩沖區大小,代碼如下:

<a href="http://tutorials.jenkov.com/java-io/linenumberreader.html">原文連結</a>

linenumberreader是記錄了已讀取資料行号的bufferedreader。預設情況下,行号從0開始,當linenumberreader讀取到行終止符時,行号會遞增(譯者注:換行\n,回車\r,或者換行回車\n\r都是行終止符)。

你可以通過getlinenumber()方法擷取目前行号,通過setlinenumber()方法設定目前行數(譯者注:setlinenumber()僅僅改變linenumberreader内的記錄行号的變量值,不會改變目前流的讀取位置。流的讀取依然是順序進行,意味着你不能通過setlinenumber()實作流的跳躍讀取)。代碼如下:

如果解析的文本有錯誤,linenumberreader可以很友善地定位問題。當你把錯誤報告給使用者時,如果能夠同時把出錯的行号提供給使用者,使用者就能迅速發現并且解決問題。

<a href="http://tutorials.jenkov.com/java-io/streamtokenizer.html">原文連結</a>

streamtokenizer(譯者注:請注意不是stringtokenizer)可以把輸入流(譯者注:inputstream和reader。通過inputstream構造streamtokenizer的構造函數已經在jdk1.1版本過時,推薦将inputstream轉化成reader,再利用此reader構造stringtokenizer)分解成一系列符号。比如,句子”mary had a little lamb”的每個單詞都是一個單獨的符号。

當你解析檔案或者計算機語言時,為了進一步的處理,需要将解析的資料分解成符号。通常這個過程也稱作分詞。

通過循環調用nexttoken()可以周遊底層輸入流的所有符号。在每次調用nexttoken()之後,streamtokenizer有一些變量可以幫助我們擷取讀取到的符号的類型和值。這些變量是:

ttype 讀取到的符号的類型(字元,數字,或者行結尾符)

sval 如果讀取到的符号是字元串類型,該變量的值就是讀取到的字元串的值

nval 如果讀取到的符号是數字類型,該變量的值就是讀取到的數字的值

代碼如下:

譯者注:tt_eof表示流末尾,tt_eol表示行末尾。

streamtokenizer可以識别标示符,數字,引用的字元串,和多種注釋類型。你也可以指定何種字元解釋成空格、注釋的開始以及結束等。在streamtokenizer開始解析之前,所有的功能都可以進行配置。請查閱官方文檔擷取更多資訊。

<a href="http://tutorials.jenkov.com/java-io/printwriter.html">原文連結</a>

值得一提的是,printwriter有更多種構造函數供使用者選擇,除了可以輸出到檔案、writer以外,還可以輸出到outputstream中(譯者注:printstream隻能把資料輸出到檔案和outputstream)。

<a href="http://tutorials.jenkov.com/java-io/stringreader.html">原文連結</a>

stringreader能夠将原始字元串轉換成reader,代碼如下:

<a href="http://tutorials.jenkov.com/java-io:-stringwriter.html">原文連結</a>

stringwriter能夠以字元串的形式從writer中擷取寫入到其中資料,代碼如下:

tostring()方法能夠擷取stringwriter中的字元串資料。

getbuffer()方法能夠擷取stringwriter内部構造字元串時所使用的stringbuffer對象。