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
当我们像这样将字符串传递给扫描器时,我们得到 '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