我使用的标签(/吨)作为分隔符,我知道有我的数据,例如一些空字段:
one->two->->three
凡 - >等于标签。 正如你可以看到一个空场仍正常通过标签包围。 数据是使用回路中收集:
while ((strLine = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(strLine, "\t");
String test = st.nextToken();
...
}
然而,Java的忽略这个“空字符串”,并跳过领域。
有没有办法来规避这种行为和强制Java在空字段反正看?
有一个在Sun的错误数据库RFE这个StringTokenizer
问题与状态Will not fix
。
这个RFE状态的评价,我引述如下:
随着加入的java.util.regex
的包1.4.0
,我们已经基本废弃了必要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
共享StringUtils.splitPreserveAllTokens() 。 这不正是你所需要的。
我会用番石榴的利斧 ,这并不需要所有的大正则表达式的机械,更乖巧比字符串的split()
方法:
Iterable<String> parts = Splitter.on('\t').split(string);
正如你可以在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
的方法String
或java.util.regex
包来替代。