
本文介绍如何在 java 中准确解析以制表符分隔的文本行,尤其解决 `stringtokenizer` 无法识别连续分隔符导致空字段丢失的问题,推荐使用 `string.split()` 或专业 csv 库实现完整字段保留。
StringTokenizer 是 Java 早期提供的字符串分割工具,但其设计初衷不支持保留空令牌(empty tokens):当遇到连续分隔符(如 \t\t)时,它会将中间的空白视为“无意义分隔”,直接跳过,导致字段数量减少、位置错位——这正是您示例中输出字段数不一致(9/10/11)且缺失空值的根本原因。
✅ 正确做法:使用 String.split(String regex, int limit) 并指定负数 limit 参数(如 -1),可强制保留末尾及中间所有空字符串:
String[] fields = line.split("\t", -1); // 关键:-1 表示不限制分割次数,保留所有空项
ArrayList al = new ArrayList<>(Arrays.asList(fields));
System.out.println(al.size() + " >> " + al); 运行上述代码处理您的测试数据(例如 "R\t900081458\t22222-22-2\t\t\t1\t-1\t1\t0\t0\t1"),将稳定输出 11 个元素,其中连续 \t\t\t 生成三个空字符串 "",对应您期望的 "BLANK" 占位(您可在后续逻辑中统一将 "" 替换为 "BLANK"):
// 可选:将空字符串转为"BLANK" al.replaceAll(s -> s.isEmpty() ? "BLANK" : s);
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- split("\t")(无 limit 参数)等价于 split("\t", 0),会自动丢弃末尾空字符串,仍可能导致字段数不一致;
- 制表符在字符串字面量中需写为 "\t",确保与文件实际分隔符一致(避免误用 "\\t" 字符串字面量);
- 若数据含转义字符、引号包裹或换行等复杂 CSV 场景,强烈建议改用成熟库如 OpenCSV 或 Apache Commons CSV,它们能安全处理边缘情况。
总结:摒弃 StringTokenizer 处理含空字段的分隔符场景;优先采用 String.split(regex, -1) 实现语义准确、代码简洁的字段解析;对生产级数据文件,引入专业 CSV 解析器是更健壮、可维护的选择。










