在类java.util.Scanner中,方法public String next()从这个Scanner中查找并返回下一个完整的令牌,如果我编写这样的程序,我会感到困惑:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println(in.next());
in.close();
}然后运行这个程序,然后输入一个单词,这个单词就会被打印出来,似乎方法next()返回了当前的令牌,为什么接口说next()返回下一个完整的令牌呢?
发布于 2015-11-20 22:55:19
既然你很困惑,我将描述这一切是关于什么的。
Scanner input = new Scanner(System.in) java.lang.System是扩展java.lang.Object的公共最终类,它具有静态字段,即err和out的类型为PrintStream,in的类型为InputStream。
System.injava.util.Scanner扩展了java.lang.Object并实现了以下接口:
现在我们理解了层次结构。在执行过程中会发生什么?
Execution of > Scanner input = new Scanner(System.in)构造一个新的Scanner对象,向它传递期望输入的源。
Execution of > input.next() 执行以下步骤
等待输入以扫描
块执行
一旦你提供了一个输入(假设如下)
"Hello World! This is a test." 然后点击Enter,将执行以下步骤
Iterator iterate = tokens.iterator()的迭代器,用于遍历标记返回第一个完整令牌的原因是因为这是从java.util.Iterator继承的next()方法的行为方式。基本上可以把它想象成一个指针,指向扫描器中按顺序排列的一堆令牌。一旦调用next(),就会返回第一个令牌并将指针前移。
另一方面,如果此扫描器在迭代器所指向的位置有另一个标记,则hasNext()返回true。与next()不同的是,它不会超出令牌。
documentation会说以下关于next()的内容
查找并返回此扫描器中的下一个完整令牌。在完整的令牌之前和之后是与分隔符模式匹配的输入。此方法在等待输入进行扫描时可能会阻塞,即使上一次调用hasNext()返回true也是如此。
发布于 2015-11-20 19:43:44
这是因为您已将Scanner指定为标准输入(System.in)。
如果你在这篇文章中使用你的程序
IDEONE DEMO
输出(在执行之前查看stdin是如何分配的链接)
Success!
stdin // this is what you assign
hello word
stdout // this is the output of main method
hello
word如果这还不清楚,也许你会发现这个例子很有用。检查如何将Scanner分配给已创建的String
String input = "hello my name is Jordi";
Scanner s = new Scanner(input); // assign the scanner to String s!!!!
System.out.println(s.next()); // prints: hello
System.out.println(s.next()); // prints: my
System.out.println(s.next()); // prints: name
System.out.println(s.next()); // prints: is
System.out.println(s.next()); // prints: Jordi
s.close(); 发布于 2015-11-20 19:47:02
您可以认为,最初Scanner指向字符串的开头,然后当您调用next()时,它从当前位置读取开始。如下所示:
[h][e][l][l][o][_]
^Scanner的行为类似于迭代器,并且在第一个字符之前开始。
https://stackoverflow.com/questions/33825816
复制相似问题