一、Scanner类简介
Scanner类是在jdk1.5版本引入的,它在java的util工具包下,主要用于扫描用户从控制台输入的文本。
当我们需要通过控制台输入数据时,只需要事先导入java.util包中的Scanner类,然后调用Scanner类,
我们的程序就能获取我们在控制台所输入的数据了。

二、如何使用Scanner类

1、首先导入java.util.Scanner包;

import java.util.Scanner;

2、创建Scanner类对象

Scanner sc = new Scanner(System.in);

3、创建一个变量来接收输入的数据

//运用上面创建的sc对象调用对应的方法,控制台即可等待用户输入,我们自定义一个变量来接收即可//我们想要输入的数据类型不同,也需要调用不同的方法,具体应用如下:String str = sc.nextLine();String str = sc.next();byte a1= sc.nextByte();short a2= sc.nextShort();int a3 = sc.nextInt();long a4 = sc.nextLong();float a5 = sc.nextFloat();double a6 = sc.nextDouble();boolean a7 = sc.nextBoolean();

4、关闭Scanner类

//使用完Scanner后,我们一定要记得将它关闭!//因为使用Scanner本质上是打开了一个IO流,如果不关闭的话,它将会一直占用系统资源。sc.close();//但是注意一旦你关闭后,就算在sc.close()这行代码后你再重新new Scanner(System.in),那也不能重新再打开一个扫描器了,如下图会发现程序会报错//所以大家一定要在用不到扫描器之后再关闭,即把sc.close()代码放到最后。

三、next()和nextLine()的区别(很重要)
从上面的讲解,我们会发现当我们想要输入的数据类型是String时,我们有两个方法可以调用:next()和nextLine()。那这两种方法具体有什么区别呢?我们继续往下看:
(1)我们先来测试一下next():

使用多组测试用例测试后,分析输出结果不难得出以下结论(这里只贴了经典测试案例,其他的大家可以自行测试):
next()方法在识别输入的字符串时,不能得到我们输入的带有空格的字符串,只是读取到了hello。
这说明next()在读取到有效字符之后会以空格作为自己的读取结束标识符,因为我们可以发现hello前面的空格并没有影响到方法的读取。所以next()用法总结如下:

next()用法总结:1. 一定要读取到有效字符后才可以结束输入。2. 对输入的有效字符之前所遇到的空白,会自动将其去除。3. 只有输入的有效字符后才将其后面输入的空白作为结束符。4. next()不能得到带有空格的字符串。5. 读取结束后,该方法会将我们的鼠标定位在我们输入数据的那一行。

(2)再来测试一下nextLine():

分析结果发现,输入结果与输入结果完全一致,nextLine()并没有被字符串中间的空格影响读取结果。
这是因为该方法以的是回车符(也就是我们键盘的enter键)作为结束标识符。

nextLine()用法总结:1、以回车符作为结束标识符,获取到的是回车符前输入的所有字符串(包括空格)。2、读取结束后,该方法会将我们的鼠标定位在我们输入数据的那一行的下一行。

(3)先使用nextLine再使用next()、nextInt()等没问题,但是先使用next()和nextInt()等之后就不可以再紧跟nextLine使用。(这一点很重要!!!)
这是因为next()等这些方法读取结束后会紧跟一个回车符,而nextLine会直接读取到这个回车符,这就导致出现我们还没有来得及输入我们想要输入的数据,nextLine就以为我们已经输入完了这样的情况!
解决办法也很简单:我们直接在next()使用后加两个nextLine()就OK了,这样第一个nextLine()就会当一个‘替死鬼’,第二个nextLine()我们就可以输入自己想要输入的数据啦!
四、hash×××()的简单使用
我们发现Scanner类的实例变量还会有以hash开头的一系列方法,那这些方法是干什么的呢?
我们直接上测试用例,大家直观体会:

五、Scanner方法汇总

该图的意思其实就是,比如:nextlnt():只能读取int值,用户如果输入了其他非整型的数据,程序就会报错。
其他的如nextByte()、nextDouble()也是以此类推,只能读取符合该类型的数据,所以我们要根据我们输入的数据来匹配对应的方法。