Java StringTokenizer.nextToken()跳过空字段
我使用制表符(/t)作为分隔符,我知道我的数据中有一些空字段,例如:Java StringTokenizer.nextToken()跳过空字段,java,string,tokenize,Java,String,Tokenize,我使用制表符(/t)作为分隔符,我知道我的数据中有一些空字段,例如: one->two->->three 其中->等于制表符。如您所见,空字段仍然正确地由选项卡包围。 使用循环收集数据: while ((strLine = br.readLine()) != null) { StringTokenizer st = new StringTokenizer(strLine, "\t"); String test = st.nextToken(); ..
one->two->->three
其中->等于制表符。如您所见,空字段仍然正确地由选项卡包围。
使用循环收集数据:
while ((strLine = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(strLine, "\t");
String test = st.nextToken();
...
}
然而Java忽略了这个“空字符串”,跳过了这个字段
有没有办法避免这种行为并强制java读取空字段?正如您在java文档中看到的,您可以使用构造函数
公共StringTokenizer(String str、String delim、boolean returnDelims)
和returnDelims
true
因此,它将每个分隔符作为单独的字符串返回
编辑:
不要使用这种方式,因为@npe已经打印出来了,StringTokenizer不应该再使用了!见JavaDoc:
StringTokenizer是一个遗留类,为了兼容性而保留
原因,尽管新代码不鼓励使用它。建议这样做
任何寻求此功能的人都应使用字符串的拆分方法
或者改为java.util.regex
包
您可以使用Apache
Commons。它完全满足您的需要。关于这个StringTokenizer
问题,状态无法修复
本RFE的评估声明如下:
通过在1.4.0
中添加java.util.regex
包,我们
基本上不再需要StringTokenizer
。我们不会删除该文件
类的兼容性原因。但是,regex
只提供您所需要的
然后建议使用方法。我会使用它,它不需要所有大型正则表达式,而且比String的split()方法表现更好:
Iterable<String> parts = Splitter.on('\t').split(string);
Iterable parts=Splitter.on('\t').split(字符串);
非常感谢。根据第一条评论,我找到了一个解决方案:
是的,你说得对,谢谢你的推荐:
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));
}
请改用string.split(“\t”)
。从string tokenizer的java文档中可以看出,“StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管新代码中不鼓励使用它。建议寻求此功能的任何人改用string的split方法或java.util.regex包。”只是提醒一下,它看起来像是在使用字符串。split(“\t”)
不会在末尾返回任何尾随的空标记。如果这很重要,请使用string.split(“\t”,-1)
。可以说我是偏执狂,但我真的不认为为这么简单的东西引入新的依赖项(更不用说包含在标准库中)有点过分了。我仍然很感激关于Guava splitter不需要regex tho的信息:)我大体上同意,但是Guava非常有用,并且提供了很多额外的有用类,它是我几乎所有项目的“默认”依赖项的一部分(除非它是一个非常小的自包含库)。Guava确实很棒。我还没有充分研究过番石榴的美感,因此学习它的新东西总是好的。我仍然面临这样一个问题,即我有多个标签在后面(指示白兰地),空白值不被放入数组中。我如何修复这个问题?RealDeliMes返回分隔符。这并没有回答问题。
public class TestStringTokenStrict {
/**
* Strict implementation of StringTokenizer
*
* @param str
* @param delim
* @param strict
* true = include NULL Token
* @return
*/
static StringTokenizer getStringTokenizerStrict(String str, String delim, boolean strict) {
StringTokenizer st = new StringTokenizer(str, delim, strict);
StringBuffer sb = new StringBuffer();
while (st.hasMoreTokens()) {
String s = st.nextToken();
if (s.equals(delim)) {
sb.append(" ").append(delim);
} else {
sb.append(s).append(delim);
if (st.hasMoreTokens())
st.nextToken();
}
}
return (new StringTokenizer(sb.toString(), delim));
}
static void altStringTokenizer(StringTokenizer st) {
while (st.hasMoreTokens()) {
String type = st.nextToken();
String one = st.nextToken();
String two = st.nextToken();
String three = st.nextToken();
String four = st.nextToken();
String five = st.nextToken();
System.out.println(
"[" + type + "] [" + one + "] [" + two + "] [" + three + "] [" + four + "] [" + five + "]");
}
}
public static void main(String[] args) {
String input = "Record|One||Three||Five";
altStringTokenizer(getStringTokenizerStrict(input, "|", true));
}}