扫描仪next()混淆

在类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()方法返回当前令牌,为什么API会说next()返回下一个完整的令牌?


这是因为您将Scanner分配给标准输入( System.in )。

如果你在这里使用你的确切程序

IDEONE DEMO

OUTPUT (检查链接在执行之前是如何分配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(); 

我会描述所有这些,因为你感到困惑。

Scanner input = new Scanner(System.in) 

java.lang.System中是延伸java.lang.Object中一个公共最终类,它有静态字段即犯错流出是类型PrintStream的和被类型为InputStream因此

System.in

java.util.Scanner扩展java.lang.Object并实现以下接口:

  • 迭代器
  • 可关闭
  • AutoCloseable
  • 现在我们理解了层次结构。 执行期间会发生什么?

    Execution of > Scanner input = new Scanner(System.in)
    

    构造一个新的Scanner对象,通过它传递它应该期望输入的源。

    Execution of > input.next() 
    

    执行以下步骤

  • 在等待输入扫描时阻止执行
  • 只要你提供一个输入(假设如下)

    "Hello World! This is a test." 
    

    并按Enter键进行以下步骤

  • 扫描仪从输入流中读取数据
  • 使用分隔符(默认空格)对输入进行标记
  • 构造一个Iterator iterate = tokens.iterator()的迭代器,以通过标记进行迭代
  • 在扫描器中查找第一个完整的令牌“Hello”,返回令牌并在下一个令牌之前等待。
  • 返回第一个完整标记的原因是因为这是从java.util.Iterator继承的next()方法的行为。 基本上把它看成一个指针,指向排列顺序排列的扫描器中的一堆令牌。 只要next()被调用,返回第一个标记并将指针向前移动。

    另一方面, hasNext()返回true,如果此扫描程序具有来自迭代器指向的位置的另一个标记。 与next()不同,它不会超过令牌。

    该文档说明下面的内容()

    查找并返回此扫描程序中的下一个完整标记。 完整的令牌前后有与分隔符模式匹配的输入。 即使先前调用hasNext()返回true,该方法也可能在等待输入进行扫描时阻塞。


    链接地址: http://www.djcxy.com/p/96089.html

    上一篇: Scanner next() confusion

    下一篇: Scanner next() throwing NoSuchElementException for some online compilers