sc.hasNextInt()什么时候等待输入?

时间:2016-05-10 10:52:12

标签: java io buffer java.util.scanner

根据hasNextInt()的Java文档:

  

如果此扫描仪的输入中有另一行,则返回true。 此方法可能会在等待输入时阻止。扫描仪不会超过任何输入。

使用System.out.println("Enter something:"); while(!scn.hasNextInt()){ //do whatever.. } 时,可能会导致扫描仪等待用户输入。

例如:

Enter something:_     //(The underscore indicates the prompt waiting for user input)

输出:

hasNextInt()

我的问题是.hasNextInt()什么时候会等待输入?什么时候不会?是否在I / O缓冲区中没有要接收的令牌时,它会等待输入吗?

注意:我不是问如何使用hasNextInt()实现正确的代码。我问什么时候会font-size:0px;等待输入。

1 个答案:

答案 0 :(得分:1)

首先,您应该注意hasNextInt()实际上完成了两项任务。

  1. 检查基础流中是否还有其他令牌。
  2. 如果有,则检查该令牌是否实际上是有效的int
  3. 所以它尝试做的第一件事是根据Scanner的分隔符获得一个完整的令牌。它检查到目前为止在内存中收集的数据是否是一个完整的令牌 - 也就是说,我们已经命中了分隔符或流的末尾 - 如果是这样,它可以继续匹配并判断它是否为int。

    假设到目前为止输入中有“12”。在你点击分隔符或流的末尾之前,你不知道它是否会是12,123,12.5,12A等。

    现在,如果找不到分隔符,它会尝试从基础流中读取更多数据。当它这样做时,它可以阻止。该块可以是短时间(当底层流是文件时,它可能暂时阻塞,直到从磁盘中取出块),稍长(等待数据包从网络连接到达),或者非常长 - 在如果底层流是一个控制台。

    来自控制台的输入流在用户按返回之前不会检索数据。因此,如果用户输入类似123 dog cat的内容 - 但未按返回,则基础流不会从read()返回,hasNextInt()将阻止,直到用户按返回

    用户按下返回后,您实际上有三个令牌可用,因此当前hasNextInt()将返回true,然后您就可以读取该令牌并致电hasNextInt()再次,它不会阻止,而是立即返回false(有一个令牌,但它不是一个整数)。对于下一个,情况也是如此,然后它将再次阻止,因为用户需要输入另一行并再次按 Return

    总结一下:

      只要基础流阻止,
    • hasNextInt()就会阻止。
    • 当底层流是文件或网络时,块通常很短。
    • 当基础流来自控制台时,它将在前一行已被扫描的情况下长时间阻止,但用户未按返回发送下一行。
    • 如果从控制台扫描时,单行上有多个令牌,那么它将阻止该行上的第一个令牌,而不会阻止其他令牌。