这个问题在这里已经有了答案:
如何使用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()
等待输入。
1条答案
按热度按时间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发送下一行时,它将阻塞很长一段时间。
从控制台扫描时,如果一行上有多个令牌,那么它将为该行上的第一个令牌阻塞一次,而不会为其他令牌阻塞。