2012-07-10 29 views
13

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

one->two->->three 

在哪里 - >等于标签。正如你所看到的,一个空的字段仍然被标签正确包围。 数据使用循环收集:

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

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

有没有办法规避这种行为并强制java读空字段?

+4

使用'string.split(“\ t”的)'代替。 – 2012-07-10 08:23:33

+3

来自String文档的String tokenizer“StringTokenizer是一个遗留类,为了兼容性的原因,虽然在新代码中不鼓励使用它,但建议任何寻求这种功能的人都使用String的split方法或java.util.regex取而代之。“ – Inquisitive 2012-07-10 08:35:26

+1

只看起来,它看起来像使用'string.split(“\ t”)'不会返回任何尾随空的标记。如果这很重要,请使用'string.split(“\ t”,-1)'。 – Oded 2015-11-21 18:10:11

回答

7

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

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

正如你可以在Java文档看http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html你可以returnDelimstrue

所以返回每个分隔符作为一个单独的字符串中使用构造public StringTokenizer(String str, String delim, boolean returnDelims)

编辑:

不要使用这种方式,因为@npe已经打了出来,StringTokenizer的不应该使用!见的JavaDoc:

的StringTokenizer是一个遗留类被保留兼容性 原因虽然它的使用在新代码气馁。建议 ,任何人寻求此功能使用的Stringsplit方法或java.util.regex包来替代。

+0

我仍然面临的问题是,我有相互背后的多个选项卡(表明blanc字段)空白值不放入数组..如何解决这个问题? – FireFox 2012-07-11 12:38:11

+0

returnDelims返回分隔符。这并没有回答这个问题。 – 2017-04-11 11:49:57

15

有关于此StringTokenizer问题的RFE in the Sun's bug database状态Will not fix

这个RFE状态的评价,我引用:

随着1.4.0添加java.util.regex包,我们有 基本废弃需要StringTokenizer。出于兼容性原因,我们不会删除 类。但regex只给你你需要的东西。

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

1

我会用Guava's Splitter,这并不需要所有的大正则表达式的机械,更乖巧比字符串的split()方法:

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

打电话给我偏执狂,但我真的不认为引入一个如此简单的东西(更不用说包括在标准库中)的新的依赖是有点矫枉过正。我仍然欣赏关于番石榴分流器不需要正则表达式的信息:) – posdef 2012-07-10 08:33:44

+0

我同意,一般来说,但番石榴是如此有用,并提供了很多额外的有用类,它几乎是我所有项目的“默认”依赖项的一部分(除非它是非常小的自包含库)。 – 2012-07-10 08:41:54

+0

番石榴确实很棒。我还没有完全探索Guava的迷人之处,因此学习新东西总是很好的。 – posdef 2012-07-10 09:09:01