一、StreamTokenizer概述
Java中的StreamTokenizer類是用於解析輸入流的一個強大工具,可以按照不同的標記對輸入進行解析,並將其分類。
StreamTokenizer用於將位元組流轉換為字符流並對其進行分詞,可以識別各種類型的標記,如字符串、整數和浮點數。
StreamTokenizer是一種高效的解析工具,適用於解析文本文件、配置文件等一般應用場景。它比Scanner類更加高效,因為它不需要進行正則表達式的匹配。
二、StreamTokenizer主要方法
1.nextToken()
nextToken()方法用來獲取下一個標記,它返回一個整型值,表示下一個標記的類型,常見的標記類型包括:
- TT_EOF:表示已到達輸入流的末尾
- TT_NUMBER:表示下一個標記是一個數字,可以使用nval屬性來獲取該數字的值
- TT_WORD:表示下一個標記是一個字符串,可以使用sval屬性來獲取該字符串的值
- 單個字符表示該字符的ASCII碼值
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
2.parseNumbers(boolean flag)
parseNumbers()方法用來設置tokenizer是否要解析數字,默認情況下是不解析數字的。
如果flag為true,則tokenizer會將所有數字作為標記來處理。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.parseNumbers(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
3.eolIsSignificant(boolean flag)
eolIsSignificant()方法用來設置tokenizer是否將行結束符作為標記,如果flag為true,則行結束符會被視為單獨的標記,而不是字符串的一部分。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.eolIsSignificant(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
System.out.println("End of line");
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
4.quoteChar(int ch)
quoteChar()方法用來設置tokenizer識別某個字符作為引號。當tokenizer遇到被設置的引號時,它會將引號內的所有字符作為一個標記。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
三、StreamTokenizer應用場景
1.解析CSV文件
CSV文件是一種常見的表格數據存儲格式,它使用逗號分隔列數據,並使用回車換行符作為行分隔符。
StreamTokenizer可以輕鬆解析CSV文件,並將每一列數據作為一個標記返回。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.csv"));
tokenizer.eolIsSignificant(true);
tokenizer.wordChars(',', ',');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
System.out.println("End of line");
}
}
2.解析INI文件
INI文件是一種常見的配置文件格式,它使用鍵值對的方式存儲數據。
StreamTokenizer可以輕鬆解析INI文件,並將每個鍵值對作為一個標記返回。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.ini"));
tokenizer.wordChars('_', '_');
tokenizer.wordChars('-', '-');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
String key = tokenizer.sval;
tokenizer.nextToken();
if (tokenizer.ttype == '=') {
tokenizer.nextToken();
String value = tokenizer.sval;
System.out.println(key + " = " + value);
}
}
}
3.解析XML文件
XML文件是一種常見的標記語言,用於描述和存儲數據。
StreamTokenizer可以簡單地解析XML文件,並將每個標記作為一個標記返回,並且可以使用遞歸函數進行解析內部元素。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.xml"));
tokenizer.wordChars(':', ':');
tokenizer.wordChars('_', '_');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
String tag = tokenizer.sval;
System.out.println("");
if (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println(tokenizer.sval);
}
if (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype == '/') {
System.out.println("" + tag + ">");
} else {
tokenizer.pushBack();
parseXMLElement(tokenizer);
}
}
}
public static void parseXMLElement(StreamTokenizer tokenizer) throws IOException {
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
String attribute = tokenizer.sval;
tokenizer.nextToken();
String value = tokenizer.sval;
System.out.println(attribute + " = " + value);
} else if (tokenizer.ttype == StreamTokenizer.TT_SLASH) {
break;
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/304215.html
微信掃一掃
支付寶掃一掃