sc.hasnextint()何时等待输入?

kse8i1jr  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(403)

这个问题在这里已经有了答案

如何使用java.util.scanner从system.in正确读取用户输入并对其执行操作(1个答案)
四年前关门了。
根据java文档 util.Scanner.hasNextInt() :
如果此扫描仪的输入中有其他行,则返回true。此方法在等待输入时可能会阻塞。扫描仪不会超过任何输入。
使用时 hasNextInt() ,可能会导致扫描仪等待用户的输入。
例如:

System.out.println("Enter something:");
while(!scn.hasNextInt()){
    //do whatever..
}

输出:

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

我的问题是:你什么时候来 hasNextInt() 等待输入,什么时候不会?是不是当i/o缓冲区中没有可接收的令牌时,它将等待输入?
注意:我不是在问如何使用 .hasNextInt() . 我在问威尔什么时候来 hasNextInt() 等待输入。

hfwmuf9z

hfwmuf9z1#

首先,你应该注意到 hasNextInt() 实际上有两个任务。
检查基础流中是否有其他令牌。
当有一个令牌时,它会检查该令牌实际上是否有效 int .
因此,它要做的第一件事是根据扫描器的分隔符获取一个完整的令牌。它检查到目前为止在内存中收集的数据是否是一个完整的标记—也就是说,我们找到了一个分隔符或流的结尾—如果是,它可以继续进行匹配并确定它是否是一个int。
假设到目前为止输入中有“12”。你不知道它是12,123,12.5,12a等等,直到你碰到分隔符或者流的末尾。
现在,如果找不到分隔符,它将尝试从底层流中读取更多数据。当它这样做,它可以阻止。块可以是短时间的(当底层流是一个文件时,它可能会暂时阻塞,直到从磁盘获取块为止)、稍长的(等待数据包从网络连接到达)或很长的(如果底层流是一个控制台)。
来自控制台的输入流在用户按下return键之前不会检索数据。如果用户键入 123 dog cat -但如果不按return,底层流将不会从 read() ,和 hasNextInt() 将阻止,直到用户按return。
一旦用户按下return键,实际上您有三个可用的令牌,因此当前 hasNextInt() 会回来的 true ,然后您就可以读取该令牌并调用 hasNextInt() 再次,它不会阻塞,而是返回 false 立即(有一个标记,但不是整数)。下一行也是如此,然后它将再次阻塞,因为用户需要输入另一行并再次按return。
综上所述: hasNextInt() 当底层流阻塞时将阻塞。
当底层流是文件或网络时,块通常非常短。
当底层流来自控制台时,当上一行已经被扫描,但用户没有按return发送下一行时,它将阻塞很长一段时间。
从控制台扫描时,如果一行上有多个令牌,那么它将为该行上的第一个令牌阻塞一次,而不会为其他令牌阻塞。

相关问题