Java中Scanner的hasNext()方法为何等待输入而非返回false?
Scanner的hasNext()方法阻塞等待输入的原因及解决办法
为什么hasNext()不返回false反而阻塞?
- Scanner的
hasNext()方法本身就是这么设计的:当输入流里没找到下一个令牌时,它会一直等着,直到有新输入进来,或者输入流被关闭(也就是遇到EOF结束符)。 - 用
System.in(标准输入)的时候,这是个交互式的输入流,程序没法提前知道用户还会不会输入,所以hasNext()不会主动返回false,除非用户手动发结束信号——比如Linux/macOS按Ctrl+D,Windows按Ctrl+Z。
怎么判断输入缓冲区有没有现成内容?
要是不想让程序阻塞,又想检测当前有没有可读取的内容,可以用System.in.available()先判断:
import java.util.Scanner; import java.io.IOException; public class Main{ public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); // 先查输入流里有没有可立即读取的字节 if(System.in.available() > 0 && in.hasNext()){ System.out.println("It has next"); } else { System.out.println("It doesn't have next"); } in.close(); } }
System.in.available()会返回当前输入缓冲区里能直接读的字节数,这个方法不会阻塞。如果返回值大于0,说明有内容,再调用hasNext()就不会卡着;不然直接判定没内容。- 注意:这种方式只能检测已经到缓冲区里的输入,用户还没输入的话,不会等,直接返回false。
额外说明
如果你的需求是循环读取用户输入,直到用户主动结束,那hasNext()的阻塞行为其实是正常的,比如下面这种写法:
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ System.out.println("输入内容:" + in.next()); } System.out.println("输入流已结束"); in.close(); } }
内容的提问来源于stack exchange,提问作者Rachid
相关产品推荐
相关产品推荐

