StringTokenizer 不适合解析 CSV 或日志;它不支持正则、丢失空字段,仅适用于简单空格分隔场景;应改用 split(),其基于正则可精准处理多空格、竖线等复杂分隔符。

StringTokenizer 无法处理正则或空字段,别用它解析 CSV 或日志
Java 的 StringTokenizer 是个遗留类,不支持正则表达式分隔符,也不能保留空字段(比如 "a,,b" 会被拆成 "a"、"b",中间的空串直接消失)。它只适合简单、确定、无嵌套结构的文本,比如空格分隔的单词列表。如果你在解析带引号的 CSV、带转义的配置行、或日志中含多个连续空格的字段,StringTokenizer 会漏数据甚至出错。
用 split() 替代 StringTokenizer 处理多空格和自定义分隔符
String.split() 更灵活,底层基于正则,能准确控制分隔逻辑:
- 用
"\s+"拆分任意空白(空格、制表符、换行)并合并连续空白为一个分隔符 - 用
"\|"拆分竖线(需转义),"(? 可实现“非转义分号”分割(进阶场景) - 传入负数 limit(如
str.split(";", -1))可保留末尾空字段
示例:"a b c".split("\s+") → ["a", "b", "c"];"x||y|".split("\|", -1) → ["x", "", "y", ""]。
遇到引号包裹字段或转义字符时,必须换用专用解析器
当文本含 "field with space" 或 value="a"b" 这类结构,split() 和 StringTokenizer 都无能为力。这时候得上真实解析器:
立即学习“Java免费学习笔记(深入)”;
- CSV 场景:用
OpenCSV(CsvParser)或Apache Commons CSV - 配置/键值对:用
Properties.load()(支持注释、转义)或java.util.Scanner配合useDelimiter() - 日志行(如 Nginx access log):先用正则
Pattern.compile(...)提取命名组,比硬拆更可靠
StringTokenizer 的唯一合理使用场景:性能敏感且格式绝对简单
只有满足全部条件时才考虑 StringTokenizer:
- 输入来源完全可控(比如你生成的固定格式字符串)
- 分隔符是单个字符(如
' '、','),且绝不会连续出现 - 不需要空字段,也不需要跳过前导/尾随分隔符
- 运行在资源极受限环境(如旧嵌入式 JVM),且 profile 确认
split()成了瓶颈
否则,写两行 split() 就能搞定的事,没必要绕回这个 90 年代设计的类——它连 hasNextToken() 都没实现 Iterator 接口,现代代码里混用反而增加维护成本。


















