Scanner类:简单文本扫描器
在我们实际的开发过程中,使用Scanner来键盘录入,那么怎么才能在eclipse中实现键盘录入呢?
1)创建键盘录入对象
Scanner sc = new Scanner(System.in);
2)导包(因为Scanner类是在java.util包下)
import java.util.Scanner;(快捷键:Ctrl+shift+o)
3)接收数据
XXX 变量名 = sc.nextXXX();
查看API文档,可以发现Scanner类中有public Scanner(InputStream source)这个构造方法,这表示Scanner以输入流的形式录入数据的,其中InputStream是指字节输入流,我们常用InputStream in = System.in ; 表示底层执行返回的是一个字节输入流(标准输入流)
举个例子感受一下Scanner的用法:
public class ScannerDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//接收数据
int a = sc.nextInt() ;
System.out.println("a:"+a);
}
}
这样就实现了键盘录入的功能。
在Scanner类中它提供一个判断功能:
public boolean hasNextXXX():当前扫描器判断是否有下一个可以录入的XXX类型数据
如果录入的数据和接收的数据类型不一致会抛出一个异常:java.util.InputMismatchException:录入的数据和接收的数据类型不匹配异常
判断功能可以这样使用:
Scanner sc = new Scanner(System.in) ;
System.out.println("请输入一个数据:");
if(sc.hasNextInt()) {
int num = sc.nextInt() ;
System.out.println("num:"+num);
}else {
System.out.println("您输入的数据类型不匹配...");
}
这样就实现了只有当输入和接收的数据都是int时才会输出该数据,否则就输出类型不匹配
这里有一个需要注意的点:
当键盘录入两个int类型的数据,分别输出,没有问题
当键盘录入两个String类型的数据,分别输出:没有问题
先录入一个String类型的数据,再录入int类型的数据,没有问题
先录入一个int类型的数据,再录入String类型的数据,就会出现一个问题,第二个数据是字符串类型,又由于录入下一个数据要"空格",但空格本身是一个字符串,所以String类型的值并没有录入,那么该如何解决这个问题呢?这时就需要重新创建键盘录入对象才能正确录入:
Scanner sc = new Scanner(System.in) ;
int a = sc.nextInt() ;
Scanner sc2 = new Scanner(System.in) ;
String b = sc2.nextLine() ;
System.out.println("a:"+a+",b:"+b);