当1024个字符是特定器时,Java Scanner类在令牌化中失败



我发现了java.util.scanner类的奇怪行为。我需要将一个字符串变量拆分为一组由";"分隔的令牌。

如果我考虑了" A [*1022]" "; [*n]的字符串"我希望有一个令牌。但是,如果n = 3扫描仪类失败:它"请参见" 2个令牌而不是3。我认为这与扫描仪类的内部char缓冲区大小有关。

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

我想跳过"不正确"的行为,您能帮我吗?谢谢

我的建议是向Oracle报告该错误,然后使用BufferedReader读取您的InputStream(还需要InputStreamReader类)。Scanner的作用不是魔术,在这种情况下,直接与BufferedReader合作只需要比您已经使用的代码稍多。

最新更新