当我们将字符串传递给扫描仪时,我们将获得'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”。 控制台希望输入另一个/以输出相同的值。
为什么它们的工作方式有所不同?
答案 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