除了常見的 StringTokenizer,Java 還提供更底層、功能更強大的 java.io.StreamTokenizer,專門操作輸入串流而非字串,每個位元組視為 '\u0000' 至 '\u00FF' 範圍的字元。它提供對斷詞規則的精細控制,適合處理原始碼、設定檔等結構化文本解析。
| 特性 | StringTokenizer | StreamTokenizer |
|---|---|---|
| 輸入來源 | String | InputStream / Reader |
| 斷詞規則 | 固定分隔字元 | 可程式化語法表 |
| 數字處理 | 無 | 內建數值辨識 |
| 引號字串 | 無 | 支援單雙引號 |
| 註解處理 | 無 | 支援單行/多行註解 |
import java.io.*;
import java.util.*;
public class UniqueWordExtractor {
public static void main(String[] args) throws IOException {
if (args.length == 0) {
System.err.println("用法: java UniqueWordExtractor <輸入檔案>");
System.exit(1);
}
Set wordSet = new TreeSet<>(); // 自動排序且不重複
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
StreamTokenizer st = new StreamTokenizer(br)) {
st.resetSyntax(); // 清除預設規則
st.wordChars('A', 'Z'); // 定義大寫字母為單字字元
st.wordChars('a', 'z'); // 定義小寫字母為單字字元
// 可依需求加入數字、底線等:st.wordChars('0', '9'); st.wordChars('_', '_');
int tokenType;
while ((tokenType = st.nextToken()) != StreamTokenizer.TT_EOF) {
if (tokenType == StreamTokenizer.TT_WORD) {
wordSet.add(st.sval.toLowerCase()); // 忽略大小寫
}
}
}
// 輸出結果
for (String word : wordSet) {
System.out.println(word);
}
}
}
resetSyntax() — 重置所有字元為普通字元wordChars(int low, int hi) — 設定字元範圍為單字構成字元whitespaceChars(int low, int hi) — 設定空白字元範圍ordinaryChars(int low, int hi) — 設定為普通字元(單字分隔符)commentChar(int ch) — 設定單行註解起始字元slashStarComments(true) / slashSlashComments(true) — 啟用 C/C++ 風格註解quoteChar(int ch) — 設定引號字元(支援跳脫序列)parseNumbers() — 啟用數值辨譌(整數、浮點數、科學記號)eolIsSignificant(true) — 讓換行符成為獨立標記ttype — 當前標記型別(TT_WORD、TT_NUMBER、TT_EOL、TT_EOF)sval — 當前單字標記的字串值nval — 當前數值標記的數值StreamTokenizer 雖然 API 較舊(非介面導向),但其靈活的語法表機制在特定領域仍具不可替代的優勢。