首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scanner next()混淆

Scanner next()混淆
EN

Stack Overflow用户
提问于 2015-11-20 19:38:24
回答 3查看 440关注 0票数 1

在类java.util.Scanner中,方法public String next()从这个Scanner中查找并返回下一个完整的令牌,如果我编写这样的程序,我会感到困惑:

代码语言:javascript
复制
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println(in.next());
    in.close();
}

然后运行这个程序,然后输入一个单词,这个单词就会被打印出来,似乎方法next()返回了当前的令牌,为什么接口说next()返回下一个完整的令牌呢?

EN

回答 3

Stack Overflow用户

发布于 2015-11-20 22:55:19

既然你很困惑,我将描述这一切是关于什么的。

代码语言:javascript
复制
Scanner input = new Scanner(System.in) 

java.lang.System是扩展java.lang.Object的公共最终类,它具有静态字段,即errout的类型为PrintStream,in的类型为InputStream。

代码语言:javascript
复制
System.in

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

  • Iterator
  • Closeable
  • AutoCloseable

现在我们理解了层次结构。在执行过程中会发生什么?

代码语言:javascript
复制
Execution of > Scanner input = new Scanner(System.in)

构造一个新的Scanner对象,向它传递期望输入的源。

代码语言:javascript
复制
Execution of > input.next() 

执行以下步骤

等待输入以扫描

  • 时,

块执行

一旦你提供了一个输入(假设如下)

代码语言:javascript
复制
"Hello World! This is a test." 

然后点击Enter,将执行以下步骤

  • 扫描程序使用分隔符(默认空格)从输入中读取数据
  • 构造一个类似于Iterator iterate = tokens.iterator()的迭代器,用于遍历标记
  • 在扫描程序中找到第一个完整的标记"Hello“,返回该标记并在下一个标记之前等待。

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

另一方面,如果此扫描器在迭代器所指向的位置有另一个标记,则hasNext()返回true。与next()不同的是,它不会超出令牌。

documentation会说以下关于next()的内容

查找并返回此扫描器中的下一个完整令牌。在完整的令牌之前和之后是与分隔符模式匹配的输入。此方法在等待输入进行扫描时可能会阻塞,即使上一次调用hasNext()返回true也是如此。

票数 2
EN

Stack Overflow用户

发布于 2015-11-20 19:43:44

这是因为您已将Scanner指定为标准输入(System.in)。

如果你在这篇文章中使用你的程序

IDEONE DEMO

输出(在执行之前查看stdin是如何分配的链接)

代码语言:javascript
复制
Success!

stdin  // this is what you assign
    hello word

stdout  // this is the output of main method
    hello
    word

如果这还不清楚,也许你会发现这个例子很有用。检查如何将Scanner分配给已创建的String

代码语言:javascript
复制
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(); 
票数 1
EN

Stack Overflow用户

发布于 2015-11-20 19:47:02

您可以认为,最初Scanner指向字符串的开头,然后当您调用next()时,它从当前位置读取开始。如下所示:

代码语言:javascript
复制
[h][e][l][l][o][_]
^

Scanner的行为类似于迭代器,并且在第一个字符之前开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33825816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档