Scanner类hasNext()与hasNextInt()为何在缓冲区空时阻塞等待输入?
Scanner的hasNext()为何会阻塞等待输入?
你对hasNext()/hasNextInt()的理解存在偏差,这类方法的实际行为和你预期的并不一致:
- 当Scanner关联的输入源(比如控制台
System.in)还有可能产生数据时,hasNext()不会直接返回false,而是会阻塞等待,直到从输入源读取到足够判断是否存在下一个令牌的数据,或者输入流被关闭。 - 只有当输入流明确到达末尾(比如控制台输入按
Ctrl+D/Unix或Ctrl+Z/Windows关闭流),hasNext()才会返回false。
看你提供的代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println(input.hasNext()); } }
运行时,Scanner绑定的是控制台输入流,此时缓冲区为空,但输入流并没有关闭——Scanner无法确定之后会不会有输入,所以会一直阻塞,直到你输入内容并回车。此时缓冲区有了可用令牌,hasNext()返回true,打印后程序结束。
hasNextInt()的逻辑完全一致:如果当前缓冲区没有可解析为int的令牌,它会阻塞等待输入,直到读到能判断是否为整数的内容,或者输入流关闭。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

