系統(tǒng)學(xué)習(xí) Java IO (十五)----字符讀寫 Reader/Writer 其他子類

目錄:系統(tǒng)學(xué)習(xí) Java IO---- 目錄,概覽

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

LineNumberReader 類是一個(gè) BufferedReader ,用于跟蹤讀取字符的行號。行號從 0 開始。每當(dāng) LineNumberReader 在包裝的 Reader 返回的字符中遇到行終止符時(shí),行號遞增。

可以通過調(diào)用 getLineNumber() 方法獲取當(dāng)前行號,也可以通過調(diào)用 setLineNumber() 方法設(shè)置當(dāng)前行號。
注意設(shè)置的行號不會改變實(shí)際的文件指針,僅僅是改變了內(nèi)部的一個(gè) lineNumber 變量,這樣getLineNumber() 方法獲取的也是 lineNumber 變量的值,不要妄想通過這個(gè) setLineNumber() 方法隨機(jī)訪問文本行。
一個(gè)示例如下:

public class LineNumberReaderExample {
    public static void main(String[] args) throws IOException {
        /*文件內(nèi)容是:
        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); // 這個(gè)方法只是指示了當(dāng)前行號,并不會改讀取結(jié)果
        System.out.println("line= " + reader.getLineNumber() + ", context= " + reader.readLine());
    }
}

輸出的結(jié)果是:

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

如果要解析可能包含錯(cuò)誤的文本文件,則此類很方便。 向用戶報(bào)告錯(cuò)誤時(shí),如果指出錯(cuò)誤在第幾行,則更容易糾正錯(cuò)誤。

完成從 LineNumberReader 讀取字符時(shí),記得關(guān)閉它,LineNumberReader 還將關(guān)閉 LineNumberReader 正在讀取的 Reader 實(shí)例。調(diào)用 close() 方法可以關(guān)閉 LineNumberReader 。

標(biāo)記字符輸入流 StreamTokenizer

StreamTokenizer 類可以將從 Reader 讀取的字符做標(biāo)記。 例如,在字符串“I love money...”中,每個(gè)單詞都是一個(gè)單獨(dú)的標(biāo)記。

在解析文件或計(jì)算機(jī)語言時(shí),在進(jìn)一步處理它們之前將輸入分解為標(biāo)記是正常的。 此過程也稱為“詞法(lexing)”或“ 符號化(tokenizing)”。
使用 StreamTokenizer 類,可以瀏覽基礎(chǔ) Reader 中的標(biāo)記。 通過在循環(huán)內(nèi)調(diào)用 StreamTokenizer 的 nextToken() 方法來實(shí)現(xiàn)此目的。 每次調(diào)用 nextToken() 之后,StreamTokenizer 都有幾個(gè)字段,可以閱讀這些字段以查看讀取的令牌類型和值等。這些字段是:

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

這是一個(gè)簡單的 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 能夠識別標(biāo)識符,數(shù)字,帶引號的字符串和各種注釋樣式。 還可以指定要將哪些字符解釋為空格,注釋開始,結(jié)束等。在開始解析其內(nèi)容之前,所有這些都在 StreamTokenizer 上配置。 有關(guān)更多信息,請參閱 JavaDoc。

當(dāng)從 StreamTokenizer 讀完令牌后,記得關(guān)閉它。 關(guān)閉 StreamTokenizer 還將關(guān)閉 StreamTokenizer 正在讀取的 Reader 實(shí)例。

打印字符流 PrintWriter

PrintWriter 類可以將格式化數(shù)據(jù)寫入基礎(chǔ) Writer 。 例如,將 int,long 和其他基本類型數(shù)據(jù)寫為格式化為文本,而不是作為其字節(jié)值。
如果要生成必須混合文本和數(shù)字的報(bào)表(或類似報(bào)表),PrintWriter 非常有用。 除了寫入原始字節(jié)的方法之外,PrintWriter 類具有與 PrintStream 相同的所有方法。 作為 Writer 子類,PrintWriter 旨在編寫文本。
一個(gè)示例如下:

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 文件內(nèi)容是“true123123.456Text + data: 123"

構(gòu)造器

PrintWriter 具有多種結(jié)構(gòu)選擇器,可以將其連接到 File,OutputStream 或 Writer 。 以這種方式,PrintWriter 與其他 Writer 子類有點(diǎn)不同,后者往往需要將其他 Writer實(shí)例作為參數(shù)的構(gòu)造函數(shù)(除了少數(shù),如 OutputStreamWriter )。

方法 描述
PrintWriter(File file, String csn) 創(chuàng)建具有指定文件和字符集且不帶自動刷行新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 通過現(xiàn)有的 OutputStream 創(chuàng)建新的可指定自動刷新的 PrintWriter。
PrintWriter(String fileName, String csn) 創(chuàng)建具有指定文件名稱和字符集且不帶自動行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) 創(chuàng)建新的可指定自動刷新的 PrintWriter。

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

close()

完成將字符寫入 PrintWriter 后,記得關(guān)閉它。 關(guān)閉 PrintWriter 還將關(guān)閉 PrintWriter 正在寫入的 Writer 實(shí)例。

字符串讀寫 StringReader/StringWriter

StringReader 類可以將普通的 String 轉(zhuǎn)換為 Reader 。
StringWriter 類能夠以 String 形式將字符寫入 Writer 。

寫入 StringWriter 的字符可以通過兩個(gè)方法 toString() 和 getBuffer() 獲得,兩個(gè)方法返回的內(nèi)容一致。
區(qū)別在于方法 toString() 返回 String 類型。方法 getBuffer() 返回 StringBuffer 類型。

一個(gè)簡單的示例如下:

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();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容