目錄:系統(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();
}
}