Java StringTokenizer.nextToken()跳过空字段

我使用标签(/ t)作为分隔符,我知道我的数据中有一些空字段,例如:

one->two->->three 

其中 – >等于标签。 正如您所看到的,空白字段仍然被选项卡正确包围。 使用循环收集数据:

  while ((strLine = br.readLine()) != null) { StringTokenizer st = new StringTokenizer(strLine, "\t"); String test = st.nextToken(); ... } 

然而,Java忽略了这个“空字符串”并跳过该字段。

有没有办法绕过这种行为并迫使java在空字段中读取?

Sun的错误数据库中有关于此StringTokenizer问题的RFE,其状态Will not fix

对此RFE的评估表明,我引述:

通过在1.4.0添加java.util.regex包,我们基本上已经废弃了对StringTokenizer的需求。 出于兼容性原因,我们不会删除该类。 但是regex为您提供所需的一切。

然后建议使用String#split(String)方法。

谢谢你。 由于第一个评论,我能够找到解决方案:是的,你是对的,谢谢你的参考:

  Scanner s = new Scanner(new File("data.txt")); while (s.hasNextLine()) { String line = s.nextLine(); String[] items= line.split("\t", -1); System.out.println(items[5]); //System.out.println(Arrays.toString(cols)); } 

您可以使用Apache Commons StringUtils.splitPreserveAllTokens() 。 它完全符合您的需求。

我会使用Guava的Splitter ,它不需要所有的大正则表达式机器,并且比String的split()方法表现得更好:

 Iterable parts = Splitter.on('\t').split(string); 

正如您在Java Doc http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html中所看到的,您可以使用构造函数public StringTokenizer(String str, String delim, boolean returnDelims) returnDelims true

所以它将每个分隔符作为单独的字符串返回!

编辑:

不要这样使用,因为@npe已经输入,不应该再使用StringTokenizer了! 请参阅JavaDoc:

StringTokenizer是一个遗留类, 出于兼容性原因保留,尽管在新代码中不鼓励使用 。 建议任何寻求此function的人都使用Stringsplit方法或java.util.regex包。