在字符界面版案例中经常会使用Scanner类接收用户输入的各种类型的数据
Scanner和String都是JDK提供的工具类,都是引用类型
Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符;比如空格,回车,tab 等等。
System.in 系统录入 和 System.out 相反
内置方法
使用步骤:
第一步:导入
import java.util.Scanner;
第二步:创建一个Scanner对象,用于接收系统的录入
Scanner scanner = new Scanner(System.in);
第三步:定义对象进行输入
int age = scanner.nextInt();
第四步:关闭输入
scanner.close();
比如:
姓名 String 类型
年龄 int 类型
扫描到一个空白符号就终止(空格,回车,tab 等),但是如果只扫描到一个空白符不会终止,而会一直阻塞等待,直到有值。并将这个空白符连同后面的所有符号一起交给下一次扫描(缓存),
与next()类似,只能输入int类型(异常类型会报InputMismatchException)
其他基本数据类型雷同
注意此处:
两者都会空白符做分割符,并将这个空白符连同后面的所有符号一起交给下一次扫描
只有扫描到回车符 “\r”才终止。不会将空白符交给下一次扫描
其实按照原理hasNext()因该写作nextHas(),就容易理解了(坑爹的英文)。它也是种输入,该方法分为有无形参两种情况。无形参( hasNext() )就会不停的输入,有形参( hasNext(“#”) )就会判断下一个next()中是否等于形参。等于就返回真,等待下一次输入。否则就返回假,输入结束。
参考案例5
1、正常情况下,先接收的字符串类型,后接收原始数据类型
没任何影响 next方法 同理。
// 先接收字符串 后接收数字
public static void show() {
Scanner sc = new Scanner(System.in );
System.out.println("请输入您的用户名:");
String name = sc.nextLine();
System.out.println("请输入您的年龄:");
int age = sc.nextInt();
System.out.println( name + "--" + age);
}

2、两者都会空白符做分割符,并将这个空白符连同后面的所有符号一起交给下一次扫描
// 两者都会空白符做分割符,并将这个空白符连同后面的所有符号一起交给下一次扫描
public static void show2() {
Scanner sc = new Scanner(System.in );
System.out.println("请输入您的用户名:");
String name = sc.nextLine();
System.out.println("请输入您的年龄:");
int age = sc.nextInt();
System.out.println("请输入您的金币:");
int money = sc.nextInt();
System.out.println( name + "--" + age + "--" + money);
}

此时会发现金币处使用的数据是 年龄空格后的 缓存数据19 并不是我们输入的,程序就结束了。
3、异常情况下,先接 原始数据类型, 后接收收字符串
// 先接收数字 后接收字符串
public static void show3() {
Scanner sc = new Scanner(System.in );
System.out.println("请输入您的年龄:");
int age = sc.nextInt();
System.out.println("请输入您的用户名:");
String name = sc.nextLine();
System.out.println( name + "--" + age);
}

此时就会触发回车下坠效果 ,导致下一个字符串无法被接收。
原因:实际上nextLine()真正接收的是上面的一个回车
4、nextInt() 或 next() 之后 需要额外执行一个sc.nextLine 接收上面的回车 然后正常用nextLine来接收字符串
public static void show4() {
Scanner sc = new Scanner(System.in );
System.out.println("请输入您的年龄:");
int age = sc.nextInt();
// 额外执行一个sc.nextLine 接收上面的回车
sc.nextLine();
System.out.println("请输入您的用户名:");
String name = sc.nextLine();
System.out.println( name + "--" + age);
}

5、以#作为结束符的循环输入
// 指定符号循环接收 以#作为结束符的循环输入
public static void show5() {
Scanner sc = new Scanner(System.in );
System.out.println("请输入带#的字符串");
while( !sc.hasNext("#")){
System.out.println(sc.next());
}
System.out.println("程序结束");
}
