当1024个字符为delimeter时,Java Scanner类标记化失败

当1024个字符为delimeter时,Java Scanner类标记化失败,java,buffer,java.util.scanner,delimiter,Java,Buffer,Java.util.scanner,Delimiter,我发现java.util.Scanner类有一种奇怪的行为。 我需要将字符串变量拆分为一组以“;”分隔的标记 如果我考虑一个字符串“a[* 1022 ] +,[*n] ],我期望一个数字n的令牌。 但是,如果n=3,Scanner类失败:它只“看到”2个标记,而不是3个。我认为这与Scanner类的内部字符缓冲区大小有关 a[x1022]; -> 1 token: correct a[x1022];; -> 2 token: correct a[x1022];;

我发现java.util.Scanner类有一种奇怪的行为。 我需要将字符串变量拆分为一组以“;”分隔的标记

如果我考虑一个字符串“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();
}
import java.util.Scanner;
公共静态void main(字符串[]args){
//生成测试字符串:(1022x“a”)+(3x“))
字符串testLine=“”;
对于(int i=0;i<1022;i++){
测试线=测试线+a;
}
测试线=测试线+“;;;”;
//设置Scanner变量
字符串delimeter=“;”;
扫描仪行扫描仪=新扫描仪(测试线);
lineScanner.useDelimiter(delimeter);
int p=0;
//标记化
while(lineScanner.hasNext()){
p++;
字符串currentToken=lineScanner.next();
System.out.println(“令牌“+p+”:“+currentToken+””);
}
lineScanner.close();
}
我想跳过“不正确”的行为,你能帮我吗?
谢谢

我的建议是向Oracle报告此错误,然后使用BufferedReader读取您的InputStream(您还需要InputStreamReader类)来解决此问题。Scanner所做的并不神奇,在本例中,直接使用BufferedReader只需要比您已经使用的代码稍多一些的代码

可能是因为。看起来您无法改变这一点(尽管在某些情况下,它确实会增加缓冲区)。