天天看點

系統學習 Java IO (十五)----字元讀寫 Reader/Writer 其他子類

目錄:系統學習 Java IO---- 目錄,概覽

跟蹤行号的緩沖字元輸入流 LineNumberReader

LineNumberReader 類是一個 BufferedReader ,用于跟蹤讀取字元的行号。行号從 0 開始。每當 LineNumberReader 在包裝的 Reader 傳回的字元中遇到行終止符時,行号遞增。

可以通過調用 getLineNumber() 方法擷取目前行号,也可以通過調用 setLineNumber() 方法設定目前行号。

注意設定的行号不會改變實際的檔案指針,僅僅是改變了内部的一個 lineNumber 變量,這樣getLineNumber() 方法擷取的也是 lineNumber 變量的值,不要妄想通過這個 setLineNumber() 方法随機通路文本行。

一個示例如下:

public class LineNumberReaderExample {
    public static void main(String[] args) throws IOException {
        /*檔案内容是:
        first line
        second line
        third line
         */
        LineNumberReader reader = new LineNumberReader(new FileReader("D:\\test\\input.txt"));
        System.out.println("line= " + reader.getLineNumber() + ", context= " + reader.readLine());
        reader.setLineNumber(666); // 這個方法隻是訓示了目前行号,并不會改讀取結果
        System.out.println("line= " + reader.getLineNumber() + ", context= " + reader.readLine());
    }
}
           

輸出的結果是:

line= 0, context= first line
line= 666, context= second line
           

如果要解析可能包含錯誤的文本檔案,則此類很友善。 向使用者報告錯誤時,如果指出錯誤在第幾行,則更容易糾正錯誤。

完成從 LineNumberReader 讀取字元時,記得關閉它,LineNumberReader 還将關閉 LineNumberReader 正在讀取的 Reader 執行個體。調用 close() 方法可以關閉 LineNumberReader 。

标記字元輸入流 StreamTokenizer

StreamTokenizer 類可以将從 Reader 讀取的字元做标記。 例如,在字元串“I love money...”中,每個單詞都是一個單獨的标記。

在解析檔案或計算機語言時,在進一步處理它們之前将輸入分解為标記是正常的。 此過程也稱為“詞法(lexing)”或“ 符号化(tokenizing)”。

使用 StreamTokenizer 類,可以浏覽基礎 Reader 中的标記。 通過在循環内調用 StreamTokenizer 的 nextToken() 方法來實作此目的。 每次調用 nextToken() 之後,StreamTokenizer 都有幾個字段,可以閱讀這些字段以檢視讀取的令牌類型和值等。這些字段是:

ttype

token type ,讀取的令牌類型(字,數字,行尾)

sval

string val ,令牌的字元串值,如果令牌是字元串(word)

nval

number val ,令牌的數字值,如果令牌是數字。

這是一個簡單的 StreamTokenizer 示例:

StreamTokenizer streamTokenizer = new StreamTokenizer(new StringReader("I had 1 little cat.."));
while (streamTokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    switch (streamTokenizer.ttype) {
        case StreamTokenizer.TT_WORD:
            System.out.println(streamTokenizer.sval);
            break;
        case StreamTokenizer.TT_NUMBER:
            System.out.println((int) streamTokenizer.nval);
            break;
        case StreamTokenizer.TT_EOL: // end of the line
            System.out.println();
    }
}
           

StreamTokenizer 能夠識别辨別符,數字,帶引号的字元串和各種注釋樣式。 還可以指定要将哪些字元解釋為空格,注釋開始,結束等。在開始解析其内容之前,所有這些都在 StreamTokenizer 上配置。 有關更多資訊,請參閱 JavaDoc。

當從 StreamTokenizer 讀完令牌後,記得關閉它。 關閉 StreamTokenizer 還将關閉 StreamTokenizer 正在讀取的 Reader 執行個體。

列印字元流 PrintWriter

PrintWriter 類可以将格式化資料寫入基礎 Writer 。 例如,将 int,long 和其他基本類型資料寫為格式化為文本,而不是作為其位元組值。

如果要生成必須混合文本和數字的報表(或類似報表),PrintWriter 非常有用。 除了寫入原始位元組的方法之外,PrintWriter 類具有與 PrintStream 相同的所有方法。 作為 Writer 子類,PrintWriter 旨在編寫文本。

public class PrintWriterExample {
    public static void main(String[] args) throws IOException {
        PrintWriter printWriter = new PrintWriter(new FileWriter("D:\\test\\input.txt"));

        printWriter.print(true);
        printWriter.print((int) 123);
        printWriter.print((float) 123.456);
        printWriter.printf("Text + data: %d", 123);

        printWriter.close();
    }
}
           

最後 input.txt 檔案内容是“true123123.456Text + data: 123"

構造器

PrintWriter 具有多種結構選擇器,可以将其連接配接到 File,OutputStream 或 Writer 。 以這種方式,PrintWriter 與其他 Writer 子類有點不同,後者往往需要将其他 Writer執行個體作為參數的構造函數(除了少數,如 OutputStreamWriter )。

方法 描述
PrintWriter(File file, String csn) 建立具有指定檔案和字元集且不帶自動刷行新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 通過現有的 OutputStream 建立新的可指定自動重新整理的 PrintWriter。
PrintWriter(String fileName, String csn) 建立具有指定檔案名稱和字元集且不帶自動行重新整理的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) 建立新的可指定自動重新整理的 PrintWriter。

此外,PrintWriter 有 重載的 append()方法,print() 方法,printf()/format()方法,println()方法和 writer()方法。

close()

完成将字元寫入 PrintWriter 後,記得關閉它。 關閉 PrintWriter 還将關閉 PrintWriter 正在寫入的 Writer 執行個體。

字元串讀寫 StringReader/StringWriter

StringReader 類可以将普通的 String 轉換為 Reader 。

StringWriter 類能夠以 String 形式将字元寫入 Writer 。

寫入 StringWriter 的字元可以通過兩個方法 toString() 和 getBuffer() 獲得,兩個方法傳回的内容一緻。

差別在于方法 toString() 傳回 String 類型。方法 getBuffer() 傳回 StringBuffer 類型。

一個簡單的示例如下:

public class StringRW {
    public static void main(String[] args) throws IOException {
        StringWriter stringWriter = new StringWriter();
        stringWriter.write('H');
        stringWriter.append('e');
        stringWriter.write("llo");
        stringWriter.write("World".toCharArray());

        String data = stringWriter.toString(); // HelloWorld
        StringBuffer dataBuffer = stringWriter.getBuffer();
        System.out.println(data.equals(dataBuffer.toString())); // true
        stringWriter.close();

        StringReader stringReader = new StringReader(data);
        int d = stringReader.read();
        while (d != -1) {
            System.out.print((char) d); // HelloWorld
            d = stringReader.read();
        }
        stringReader.close();
    }
}
           

如果覺得本文有所幫助,歡迎點【推薦】!文章錯誤之處煩請留言。

轉載說明:轉載後必須在文章開頭明顯地給出作者和原文連結;引用必須注明出處;需要二次修改釋出請聯系作者征得同意。