next() VS nextLine() VS hasNext()
1. next() VS nextLine()
1.1 对比
|
组1 |
组2 |
next()/nextDouble()/nextFloat() /nextInt()/nextLine() |
nextLine () |
|
|
只返回非空字符,且不接收一切空字符 |
接收Enter键之前的所有字符, 即可以得到带blank或tab的字符串 |
对blank/tab/enter的处理 |
前导: 不予接收 后导: 视为输入的结束符, 且不予接收,而是全部留在输入流的缓冲区,被传递给后继的各种next方法 |
一律接收 |
结束方法 |
1. 输入了非空字符 -- 不输入非空字符, 不会结束, 一直block 2. ENTER |
ENTER |
结束方法的cursor |
保持在本row |
下移一row |
非空字符: 非blank/ tab/ enter 的字符 空字符:blank/ tab/ enter |
1.2 相互干扰
1)nextLine()之间,or组1之间,无干扰
2)nextLine()在组1之前,无干扰
3)组1在nextLine()之前,有干扰-->组1结束方法的enter,因为留在了buffer区,所以会被后面的nextLine()接收,从而导致nextLine()直接结束
1.2.1 干扰演示
Scanner sc = new Scanner(System.in); System.out.println("next():-" + sc.next() + "-"); System.out.println("nextLine():-" + sc.nextLine() + "-"); ----------------------------------------------------------------- "_-a_-" //注: "_"代表blank, "-"代表tab next():=a= //空字符不接受, 只接收非空字符 nextLine():= = //上句的后导字符blank、tab、enter, 被本句接收, 其中enter导致本句的nextLine()方法结束. "_-a_b_-" //注: "_"代表blank, "-"代表tab next():=a= //空字符不接受, 只接收非空字符 nextLine():= b = //上句的a后的首个空字符标识着输入结束, 并自其开始向后至enter, 都留存在buffer, 并被本句接收,其中enter导致本句的nextLine()方法结束.
1.2.2 干扰的解决
在组1后, nextLine()前, 增加一个nextLine(), 以接收组1留在buffer中的空字符
Scanner sc = new Scanner(System.in);
System.out.println("next():-" + sc.next() + "-");
sc.nextLine(); //增加以消除前句留在buffer中的enter
System.out.println("nextLine():-" + sc.nextLine() + "-");
2. hasNext()
hasNext()方法判断输入(文件、字符串、键盘等输入流)是否还有下一个输入项(token). 若有,返回true,反之false。
2.1 hasNext()的block
在非空字符输入前, hasNext()一直处于wait中以等待键盘输入, 进而block程序的继续运行.
Scanner sc = new Scanner(System.in); System.out.println("input please"); //提示输入. 如果不输入非空字符, 则下面的,sc.hasNext()一直处于等待的block中 System.out.println(sc.hasNext()); //在输入了非空字符 a 并enter后, sc.hasNext()执行完毕, 并打印判断结果 true ---------------------------------------------- input please a true
2.2 sc.hasNext()阻塞loop的退出Scanner sc = new Scanner(System.in);
//下面的loop, 会无法退出. 因为: 1)如果不输入非空字符, hasNext()一直会一直block导致无法返回boolean值供while做判断. 2)如果输入了非空字符, 那么必然返回true, 陷入死循环. 因此, loop无法跳出.
while (sc.hasNext()) {
System.out.println("Input from keyboard:" + sc.next());
}
3. hasNext(String patten)
可以设置一个非空字符作为终止符,如果下一个输入与从终止符相匹配,则返回 true。扫描器不执行任何输入。
Scanner sc = new Scanner(System.in);
while (!sc.hasNext("###")) { // 终止符为 ###. 当输入###时, 或者"前导空字符###后导空字符"(如" ### "), !sc.hasNext("###")都返回true, 从而结束loop
System.out.println("Input from keyboard:" + sc.next()); }
3.1 !sc.hasNext("空字符") 阻塞loop的退出
Scanner sc = new Scanner(System.in);
//如果判断的对象不是非空字符, 则也会因hasNext()只能读取非空字符而导致hasNext()一直处于block.
while (!sc.hasNext("\r")) {
System.out.println("Input from keyboard:" + sc.next());
}