閱讀1000 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java IO: 其他字符流(下)

本小節會簡要概括Java IO中的PushbackReader,LineNumberReader,StreamTokenizer,PrintWriter,StringReader,StringWriter。

PushbackReader

原文鏈接

PushbackReader與PushbackInputStream類似,唯一不同的是PushbackReader處理字符,PushbackInputStream處理字節。代碼如下:

PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"));

int data = reader.read();

reader.unread(data);

同樣可以設置緩衝區大小,代碼如下:

PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"), 8);

LineNumberReader

原文鏈接

LineNumberReader是記錄了已讀取數據行號的BufferedReader。默認情況下,行號從0開始,當LineNumberReader讀取到行終止符時,行號會遞增(譯者注:換行\n,回車\r,或者換行回車\n\r都是行終止符)。

你可以通過getLineNumber()方法獲取當前行號,通過setLineNumber()方法設置當前行數(譯者注:setLineNumber()僅僅改變LineNumberReader內的記錄行號的變量值,不會改變當前流的讀取位置。流的讀取依然是順序進行,意味著你不能通過setLineNumber()實現流的跳躍讀取)。代碼如下:

LineNumberReader reader = new LineNumberReader(new FileReader("c:\\data\\input.txt"));

int data = reader.read();

while(data != -1){

    char dataChar = (char) data;

    data = reader.read();

    int lineNumber = reader.getLineNumber();

}

如果解析的文本有錯誤,LineNumberReader可以很方便地定位問題。當你把錯誤報告給用戶時,如果能夠同時把出錯的行號提供給用戶,用戶就能迅速發現並且解決問題。

StreamTokenizer

原文鏈接

StreamTokenizer(譯者注:請注意不是StringTokenizer)可以把輸入流(譯者注:InputStream和Reader。通過InputStream構造StreamTokenizer的構造函數已經在JDK1.1版本過時,推薦將InputStream轉化成Reader,再利用此Reader構造StringTokenizer)分解成一係列符號。比如,句子”Mary had a little lamb”的每個單詞都是一個單獨的符號。

當你解析文件或者計算機語言時,為了進一步的處理,需要將解析的數據分解成符號。通常這個過程也稱作分詞。

通過循環調用nextToken()可以遍曆底層輸入流的所有符號。在每次調用nextToken()之後,StreamTokenizer有一些變量可以幫助我們獲取讀取到的符號的類型和值。這些變量是:

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

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

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

代碼如下:

StreamTokenizer tokenizer = new StreamTokenizer(new StringReader("Mary had 1 little lamb..."));

while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){

    if(tokenizer.ttype == StreamTokenizer.TT_WORD) {

        System.out.println(tokenizer.sval);
    } else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) {

        System.out.println(tokenizer.nval);

    } else if(tokenizer.ttype == StreamTokenizer.TT_EOL) {

        System.out.println();

    }

}

譯者注:TT_EOF表示流末尾,TT_EOL表示行末尾。

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

PrintWriter

原文鏈接

PrintStream類似,PrintWriter可以把格式化後的數據寫入到底層writer中。由於內容相似,不再贅述。

值得一提的是,PrintWriter有更多種構造函數供使用者選擇,除了可以輸出到文件、Writer以外,還可以輸出到OutputStream中(譯者注:PrintStream隻能把數據輸出到文件和OutputStream)。

StringReader

原文鏈接

StringReader能夠將原始字符串轉換成Reader,代碼如下:

Reader reader = new StringReader("input string...");

int data = reader.read();

while(data != -1) {

    //do something with data...

    doSomethingWithData(data);

    data = reader.read();

}

reader.close();

StringWriter

原文鏈接

StringWriter能夠以字符串的形式從Writer中獲取寫入到其中數據,代碼如下:

StringWriter writer = new StringWriter();

//write characters to writer.

String data = writer.toString();

StringBuffer dataBuffer = writer.getBuffer();

toString()方法能夠獲取StringWriter中的字符串數據。

getBuffer()方法能夠獲取StringWriter內部構造字符串時所使用的StringBuffer對象。

最後更新:2017-05-23 11:02:53

  上一篇:go  Java IO: 其他字節流(上)
  下一篇:go  狀態模式在領域驅動設計中的使用