Java的StringTokenizer.nextToken()跳过空字段(Java StringT

2019-06-26 04:29发布

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

one->two->->three

凡 - >等于标签。 正如你可以看到一个空场仍正常通过标签包围。 数据是使用回路中收集:

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

然而,Java的忽略这个“空字符串”,并跳过领域。

有没有办法来规避这种行为和强制Java在空字段反正看?

Answer 1:

有一个在Sun的错误数据库RFE这个StringTokenizer问题与状态Will not fix

这个RFE状态的评价,我引述如下:

随着加入的java.util.regex的包1.4.0 ,我们已经基本废弃了必要StringTokenizer 。 我们不会删除类兼容性的原因。 但是, regex为您提供了简单,你所需要的。

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



Answer 2:

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

 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));
 }


Answer 3:

您可以使用Apache共享StringUtils.splitPreserveAllTokens() 。 这不正是你所需要的。



Answer 4:

我会用番石榴的利斧 ,这并不需要所有的大正则表达式的机械,更乖巧比字符串的split()方法:

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


Answer 5:

正如你可以在Java文档看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的是保持兼容性的原因 ,虽然它的使用是在新代码气馁的遗留类。 建议任何寻求此功能使用split的方法Stringjava.util.regex包来替代。



文章来源: Java StringTokenizer.nextToken() skips over empty fields