首页 > 技术文章 > next() VS nextLine() VS hasNext()

mayingdts 2020-10-07 13:46 原文

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());
}

  

 

推荐阅读