扫描仪下一个()混乱

时间:2015-11-20 11:38:24

标签: java

在课程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()会返回下一个完整标记?< / p>

3 个答案:

答案 0 :(得分:2)

我将描述所有这些是什么,因为你感到困惑。

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." 

然后点击输入,即可执行以下步骤

  • 扫描仪从输入流中读取数据
  • 使用分隔符(默认空格)
  • 对输入进行标记
  • 构造一个与Iterator iterate = tokens.iterator()类似的迭代器,用于迭代标记
  • 在扫描仪中找到第一个完整的令牌“Hello”,返回令牌并在下一个令牌之前等待。

返回第一个完整令牌的原因是因为next()继承自java.util.Iterator的方法的行为。基本上可以把它想象成指向按顺序排列的扫描仪中的一堆标记的指针。一旦调用next(),就返回第一个标记并将指针向前移动。

另一方面,

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

documentation对next()

说了以下内容
  

查找并返回此扫描仪的下一个完整令牌。一个   完整标记之前和之后是匹配的输入   分隔符模式。此方法可能在等待输入时阻塞   扫描,即使之前的hasNext()调用返回true。

答案 1 :(得分:1)

这是因为您已将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(); 

答案 2 :(得分:0)

你可以认为,最初Scanner指向字符串的开头,然后当你调用next()时,它会从当前位置开始读取。 像这样:

[h][e][l][l][o][_]
^

扫描仪的行为类似于迭代器,并在“第一个字符之前”开始。