首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 串流標記化:StreamTokenizer 進階斷詞與解析控制

     編輯:Java 相關知識

除了常見的 StringTokenizer,Java 還提供更底層、功能更強大的 java.io.StreamTokenizer,專門操作輸入串流而非字串,每個位元組視為 '\u0000' 至 '\u00FF' 範圍的字元。它提供對斷詞規則的精細控制,適合處理原始碼、設定檔等結構化文本解析。

核心特性比較

特性StringTokenizerStreamTokenizer
輸入來源StringInputStream / 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 — 當前數值標記的數值

適用場景

  • 程式碼語法分析器、編譯器前端
  • 結構化設定檔解析(INI、JSON 簡易版等)
  • 大型文本檔案串流處理(避免一次載入整個字串)
  • 需要精確控制斷詞規則的場合

StreamTokenizer 雖然 API 較舊(非介面導向),但其靈活的語法表機制在特定領域仍具不可替代的優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved