当 1024 字符为分隔符时,Java Scanner 类在标记化中失败

Java Scanner class fails in tokenization when 1024 character is the delimeter

提问人:M.Pag 提问时间:12/2/2016 最后编辑:Andy TurnerM.Pag 更新时间:12/2/2016 访问量:144

问:

我发现java.util.Scanner类的奇怪行为。 我需要将一个 String 变量拆分为一组用“;”分隔的标记。

如果我考虑一个字符串 “a[*1022]” + “;[*n]“我期望一个数字 n 的令牌。 但是,如果 n=3,则 Scanner 类失败:它只“看到”2 个标记而不是 3 个。我认为这与 Scanner 类的内部字符缓冲区大小有关。

a[x1022];      -> 1 token: correct

a[x1022];;     -> 2 token: correct

a[x1022];;;    -> 2 token: wrong  (I expect 3 tokens)

a[x1022];;;;   -> 4 token: correct

我附上一个简单的例子:

import java.util.Scanner;

public static void main(String[] args) {

    // generate test string: (1022x "a") + (3x ";") 
    String testLine = "";
    for (int i = 0; i < 1022; i++) {
        testLine = testLine + "a";
    }
    testLine = testLine + ";;;";

    // set up the Scanner variable
    String delimeter = ";";
    Scanner lineScanner = new Scanner(testLine);
    lineScanner.useDelimiter(delimeter);
    int p = 0;

    // tokenization
    while (lineScanner.hasNext()){
            p++;
            String currentToken = lineScanner.next();
            System.out.println("token" + p +  ": '" + currentToken + "'");
    }
    lineScanner.close();
}

我想跳过“不正确”的行为,你能帮我吗? 谢谢

缓冲区 java.util.scanner 分隔符

评论

0赞 Andy Turner 12/2/2016
可能是因为 Scanner 使用的内部缓冲区大小为 1024。而且看起来你无法改变它(尽管在某些情况下它看起来确实会增加缓冲区)。

答:

0赞 Jeremy Gurr 12/2/2016 #1

我的建议是将错误报告给 Oracle,然后通过使用 BufferedReader 读取 InputStream(您还需要 InputStreamReader 类)来解决它。Scanner 的功能并不神奇,在这种情况下,直接使用 BufferedReader 只需要比您已经使用的代码略多的代码。