目錄:系統學習 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();
}
}
如果覺得本文有所幫助,歡迎點【推薦】!文章錯誤之處煩請留言。
轉載說明:轉載後必須在文章開頭明顯地給出作者和原文連結;引用必須注明出處;需要二次修改釋出請聯系作者征得同意。