一、 方法简述
Scanner类用于接收用户输入的内容。是jdk1.5之后的为了简化文本扫描的新增类,支持读取多种数据类型。
使用Scanner扫描,创建扫描器后,控制台输入数据,此时数据全部存入缓冲区;
再使用next()等方法从一块缓冲区读取相应内容。一般从遇到的第一个有效字符()开始读取,当遇到分隔符/结束符停止读取。
使用nextInt(),next(),nextLine()读取方式的具体差异:
方法 | 返回值 | 开始读取字符(包括此字符) | 停止读取字符(不包括此字符) | 光标位置 |
---|---|---|---|---|
next() | String | String | 空格/回车/制表符 | 仍在本行 |
nextXxx() | 基本数据类型xxx | xxx | 空格/回车/制表符 | 仍在本行 |
nextLine() | String | 任意字符 | 回车 | 移动到下一行起始位置 |
都以回车结束本方法,执行下个方法。next()和nextXxx()不会读取 空格/回车/制表符。
用next()和nextXxx()读取时,光标停留在结束符所在的一行。
此时缓冲区仍遗留有分割符/结束符及它们以后的内容,光标停留在这个分隔符/结束符,再使用其他读取方法都从这个分隔符/结束符开始扫描,按照自己规则读取。
如果下个方法使用nextLine(),最少会读取到一个“回车”的内容,同时“回车”又作为停止的标志,结束这一个nextLine()。
所以,next()或nextXxx()之后一般使用两个nextLine()来实现继续扫描读取一行内容。
二、 nextInt() / nextXxx() / next() 后跟 nextLine() 问题
1、如果nextXxx()或next()后面不采取措施直接使用nextLine()读取新的输入数据:
Scanner input=new Scanner(System.in);
System.out.println("请输入一行话将(使用next()读取)");
String s0=input.next();
System.out.println(s0);
//nextLine()读取到了 回车 ,回车是nextLine()的有效内容,也是其结束内容
System.out.println("请输入一行话(将使用nextLine()读取)");
String s1=input.nextLine();
System.out.println(s1);
System.out.println("请输入一行话将(使用next()读取)");
String s3=input.next();
System.out.println(s3);
启动程序,输入:“a1”,回车
控制台:
悲剧就产生了,好像nextLine()失效了一样。
2、为了使用nextLine(),让我们在next()后先加一行nextLine():
Scanner input=new Scanner(System.in);
System.out.println("请输入一行话将(使用next()读取)");
String s0=input.next();
System.out.println(s0);
//此处添加nextLine()处理掉刚才输入的内容
input.nextLine();
System.out.println("已处理掉刚才的缓冲区内容");
System.out.println("请输入一行话(将使用nextLine()读取)");
String s1=input.nextLine();
System.out.println(s1);
System.out.println("请输入一行话将(使用next()读取)");
String s3=input.next();
System.out.println(s3);
启动程序同样操作。
控制台:
使用一行nextLine()就让程序看起来天衣无缝了~
三、 scanner读取方式综合演示
再来一个综合版scanner读取,使大家更清楚的看到这种奇妙的读取方式:
Scanner input=new Scanner(System.in);
System.out.println("请输入一个整数(将使用nextInt()读取)");
int a0=input.nextInt();
System.out.println(a0);
System.out.println("请输入一个双精度数字(将使用nextDouble()读取)");
double a1=input.nextDouble();
System.out.println(a1);
//空格,回车,制表符都被nextLIne()当作有效内容
System.out.println("请输入一行话(将使用nextLine()读取)");
String a2=input.nextLine();
System.out.println(a2);
System.out.println("请输入一行话将(使用next()读取)");
String a3=input.next();
System.out.println(a3);
System.out.println("请输入一个整数(将使用nextInt()读取)");
int a4=input.nextInt();
System.out.println(a4);
启动程序依次输入: “12”,制表符,“3”,空格,“4+”,空格,回车结束
(输入加号仅仅为了区分字符串)
控制台:
继续输入:空格,“5+6”,制表符,“5”,回车结束
控制台:
可以看到,我们总共只输入了两次,但进行了5次读取。
验证了所有next读取方法读完有效字符后,执行下一个方法。都从能读取的有效字符开始:next()和nextXxx()都是读到空格/回车/制表符即结束,nextLine()则读到回车才结束。