Java 扫描仪使用定界符意外结果

Java Scanner useDelimiter unexpected result

当我们像这样将字符串传递给扫描器时,我们得到 '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'。 控制台期望输入另一个 / 以输出相同的值。

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

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

如果您输入 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