StreamTokenizer 是 Java 中用于将输入流按词法规则切分为标记的工具类,支持单词、数字等识别,需用 FileReader 初始化并配置 wordChars 等规则,通过 nextToken() 逐个读取并根据 ttype 判断类型。

StreamTokenizer 是 Java IO 中一个较老但实用的工具类,用于将输入流(如文件)按词法规则切分成“标记”(tokens),比如单词、数字、符号等。它不支持正则,也不像现代 Scanner 那样灵活,但在处理简单文本解析(如词频统计、基础语法分析)时仍具价值。
初始化 StreamTokenizer 并关联文件输入流
需先用 FileInputStream 或 FileReader 打开文件,再包装成 StreamTokenizer。推荐使用 FileReader(字符流),避免编码问题:
- 创建
FileReader实例,传入文件路径 - 用该 reader 构造
StreamTokenizer - 调用
pushBack()或resetSyntax()前,确保 tokenizer 处于初始状态
配置词法规则:识别单词与忽略空白/注释
默认情况下,StreamTokenizer 把字母开头的连续字符视为单词(TOKENWORD),但需显式设置:
-
st.wordChars('a', 'z')和st.wordChars('A', 'Z')确保大小写字母都参与构词(默认已启用,但可重置后补充) -
st.ordinaryChar('.')若想把点号当普通字符(而非小数点),需设为 ordinary;否则123.45会被识别为数字 -
st.commentChar('/')可启用单行注释(遇到 / 后跳过至行尾) -
st.whitespaceChars('\r', '\r')和st.whitespaceChars('\n', '\n')不必手动设——换行、空格、制表符默认就是空白符
逐个读取标记并判断类型
调用 nextToken() 获取下一个 token,返回值是 int 类型,对应不同 token 类型常量:
- 返回
StreamTokenizer.TT_WORD→ 当前 token 是单词,内容在st.sval中(String 类型) - 返回
StreamTokenizer.TT_NUMBER→ 当前是数字,值在st.nval中(double 类型) - 返回
StreamTokenizer.TT_EOF→ 文件结束 - 返回
StreamTokenizer.TT_EOL→ 行结束(仅在eolIsSignificant(true)后有效) - 若读到单字符(如
+、=),且未被设为 wordChar,则返回该 ASCII 值(如'+'),此时st.ttype就是该字符
典型使用示例:提取纯单词(忽略数字和标点)
以下代码片段从文件中只提取字母组成的单词:
try (FileReader fr = new FileReader("input.txt");
StreamTokenizer st = new StreamTokenizer(fr)) {
st.resetSyntax(); // 清除默认规则
st.wordChars('a', 'z');
st.wordChars('A', 'Z');
st.whitespaceChars(0, ' '); // 保留默认空白处理即可,此行非必须
st.commentChar('#'); // 可选:支持 # 开头注释
<pre class="brush:php;toolbar:false;">while (st.nextToken() != StreamTokenizer.TT_EOF) {
if (st.ttype == StreamTokenizer.TT_WORD) {
System.out.println("Word: " + st.sval);
}
}} catch (IOException e) { e.printStackTrace(); }
注意:resetSyntax() 会清空所有规则,之后必须重新定义 wordChars,否则无法识别任何单词。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











