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

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

跟蹤行號的緩衝字符輸入流 LineNumberReader

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

能夠經過調用 getLineNumber() 方法獲取當前行號,也能夠經過調用 setLineNumber() 方法設置當前行號。
注意設置的行號不會改變實際的文件指針,僅僅是改變了內部的一個 lineNumber 變量,這樣getLineNumber() 方法獲取的也是 lineNumber 變量的值,不要妄想經過這個 setLineNumber() 方法隨機訪問文本行。
一個示例以下:app

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...」中,每一個單詞都是一個單獨的標記。code

在解析文件或計算機語言時,在進一步處理它們以前將輸入分解爲標記是正常的。 此過程也稱爲「詞法(lexing)」或「 符號化(tokenizing)」。
使用 StreamTokenizer 類,能夠瀏覽基礎 Reader 中的標記。 經過在循環內調用 StreamTokenizer 的 nextToken() 方法來實現此目的。 每次調用 nextToken() 以後,StreamTokenizer 都有幾個字段,能夠閱讀這些字段以查看讀取的令牌類型和值等。這些字段是:orm

ttype token type ,讀取的令牌類型(字,數字,行尾)
sval string val ,令牌的字符串值,若是令牌是字符串(word)
nval number val ,令牌的數字值,若是令牌是數字。htm

這是一個簡單的 StreamTokenizer 示例:blog

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();
    }
}
相關文章
相關標籤/搜索