
`stringtokenizer` 支持将多个字符统一定义为分隔符集合,只需将逗号 `,` 和换行符 `\n` 同时传入构造函数的 `delim` 参数即可,无需正则或特殊转义。
StringTokenizer 的第二个构造参数 delim 是一个分隔符字符集合(delimiter set),而非分隔符序列。这意味着它会将字符串中任意一个出现在该字符串中的字符视为分隔符,而不是匹配整个子串(如 ",\n")。因此,要同时识别英文逗号和换行符,只需传入 ",\n" 即可——这里的 \n 表示“换行符字符”,Java 会正确解析为单个 LF 字符(ASCII 10),与逗号并列构成两个独立的合法分隔符。
以下是一个完整、可运行的示例:
import java.util.StringTokenizer;
public class TokenExample {
public static void main(String[] args) {
// 模拟从文本文件读取的多行含逗号数据
String input = "hello, apple, tree,\nwolf, eagle,\nbadge";
// ✅ 正确用法:将 ',' 和 '\n' 都作为分隔符(注意:是字符集,不是模式)
StringTokenizer tokenizer = new StringTokenizer(input, ",\n");
System.out.println("Extracted tokens:");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim(); // 建议 trim() 去除首尾空格
if (!token.isEmpty()) { // 过滤空字符串(如连续分隔符产生的空 token)
System.out.println("→ '" + token + "'");
}
}
}
}输出结果:
Extracted tokens: → 'hello' → 'apple' → 'tree' → 'wolf' → 'eagle' → 'badge'
⚠️ 注意事项:
- StringTokenizer 不支持正则表达式,因此 ",\\n" 或 ",\r\n" 等写法无效;若需处理 Windows 风格的 \r\n 或更复杂逻辑(如忽略空白行、保留引号内逗号),推荐改用 String.split() 配合正则,例如:
String[] tokens = input.split("[,\\r\\n]+"); // 匹配一个或多个逗号/回车/换行 - StringTokenizer 已属遗留类(legacy),官方文档明确建议优先使用 String.split() 或 java.util.Scanner ——尤其在需要灵活分隔、跳过空项或处理 Unicode 换行符(如 \u2028)时。
- 若输入含 \r\n(Windows)或 \r(旧 Mac),仅传 ",\n" 无法匹配 \r;此时应扩展为 ",\r\n"(即包含 \r 字符),或统一用 split("[,\\s]+")(\s 匹配所有空白符,但需注意会把空格也当分隔符)。
✅ 总结:对纯 LF 换行(Unix/Linux/macOS)且仅需简单分割的场景,new StringTokenizer(line, ",\n") 是简洁有效的方案;但生产环境建议转向 split() 以获得更强健性和可维护性。










