Java扫描器useDelimiter意外结果

时间:2019-04-24 16:09:35

标签: java java.util.scanner delimiter

当我们将字符串传递给扫描仪时,我们将获得'ab'作为控制台输出:

 public static void main(String []args){
    Scanner sc = new Scanner("a///b");
    sc.useDelimiter("/");

    System.out.print(sc.next());    
    System.out.print(sc.next());    
    System.out.print(sc.next());    
    System.out.print(sc.next());    
    sc.close();
 }

但是如果我们将扫描仪行更改为

Scanner sc = new Scanner(System.in);

并传递相同的字符串 a /// b

仅控制台输出“ a”。 控制台希望输入另一个/以输出相同的值。

为什么它们的工作方式有所不同?

1 个答案:

答案 0 :(得分:2)

Scanner上的String在读取'b'字符时已到达其输入的末尾。但是,当您在Scanner上使用System.in时,流尚未结束。您仍然可以在换行符后输入更多输入。

如果您输入a///b Enter ,您仍然可以输入另一个定界符/,该字符最终会让Scanner知道令牌已完成。 。如果键入foo/,则下一个标记是"b\nfoo",说明Scanner知道b只是下一个标记的开始,尚未结束直到另一个/到达流中。

在这里,我在所有输出中放置了双引号,以显示找到的每个令牌(即使为空)。

a///b    <- input; token starting with "b" is unfinished
"a"      <- output
""       <- output
""       <- output
foo/     <- input
"b       <- output
foo"     <- output