1. 程式人生 > >系統學習 Java IO (十五)----字元讀寫 Reader/Writer 其他子類

系統學習 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());
    }
}

如果要解析可能包含錯誤的文字檔案,則行號可以很方便。 向用戶報告錯誤時,如果指出錯誤在第幾行,則更容易糾正錯誤。

完成從 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();
    }
}