Java StringTokenizer.nextToken()跳过空字段

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(); ..

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

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