一、概述
对于上几期,我们有学完java的反射机制及java正则,有些小伙伴私下给我说,教的有点太难理解了,不是很能消化,说教学内容学习压力有点大,我仔细去看了看,确实是我教学先后顺序的问题,是我没把握好教学内容的先后顺序,这个得调整,教学嘛,既然是零基础,那必须得按小白级来教学才对,所以啊,我接下来呢,就给大家带来一篇非常好理解的知识点,希望大家能够喜欢。
废话不多说,咱们直接开始今日的内容。
二、本期教学目标
- 掌握Scanner类概念
- 了解Scanner类有哪些常用api
- 掌握next方法
- 掌握nextLine方法
- next()与nextLine()二者有何区别
- 实例:实现日期格式的数据输入
三、正文
1️⃣概念
针对java5版本诞生,在jdk之前版本这次的版本是添加了java.util.Scanner类;其类是一个用于扫描输入文本的工具集。它不仅提供了可结合正则表达式和从输入流中检索某些特定数据项的方法,也提供了对任意字符串和基本类型的数据进行分析。你可以使用Scanner类,针对任意要处理的文本内容编写自定义的语法分析器,替你对数据进行分析是否符合你的预定内容格式。
总而言之,有该类的存在,还是非常的方便好用。它就是一个用户获取键盘输入的工具类,也可以从文件、字符串、输入流等中解析出基本类型等值。
下面是创建Scanner类的基本语法:
Scanner scanner = new Scanner(System.in);
2️⃣常用api
如下是我实例了一个Scanner对象,通过对象点的形式,你可以看到它提供了这么多方法,那么我就对其中比较常用的api进行一下介绍吧。
- String next():查找并返回来自扫描器的下一个完整标记。
- String next(String pattern):如果下一个标记与指定的pattern指定模式匹配,则返回下一个标记。
- int nextInt():将输入信息的下一个标记扫描为一个int值。
- String nextLine():此扫描器执行当前行,并返回跳过输入信息。
- long nextLong():将输入信息的下一个标记扫描为一个long值。
- short nextShort():将输入信息的下一个标记扫描为一个short值。
- float nextFloat():将输入信息的下一个标记扫描为一个float值。
- double nextDouble():将输入信息的下一个标记扫描为一个double值。
- ...
然后其中还有nextXxx()与hasNextXxx() 方法,二者的作用就是nextXxx()是为了获取下一个输入,而hasNextXxx() 方法是判断是否有下一个输入项,其中Xxx可以是int、long、double等基础类型数据,若只判断是否包含下一个字符串,则你直接使用hasNext()方法即可。
3️⃣next()方法
接着我要重点来讲解一下next()与nextLine()方法,具有很好的参考价值。其中我先讲解下一下next方法,next()方法查找并返回来自此扫描器的下一个完整标记。切记,只读取输入直到空格。这点我会用示例给大家演示。
具体示例如下:
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个字符串");String str = scanner.next();System.out.println("您输入的字符串为:" + str);}
打印如下:
请输入一个字符串
bug
您输入的字符串为:bug
请输入一个字符串
adad dada dsada2
您输入的字符串为:adad
总而言之,示例2你们是看到了其空格所带来的问题,它不能读取由两个空格隔开的字符,next方法只读取空格之前的数据,并且光标指向本行。
4️⃣nextLine()方法
上方讲解完了next方法,接着就我就给大家讲一下其nextLine()方法,其方法是返回输入源中下一行的所有内容。
具体示例如下:
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个字符串");String str = scanner.nextLine();System.out.println("您输入的字符串为:" + str);}
打印如下:
请输入一个字符串
abcd 123 hhhh
您输入的字符串为:abcd 123 hhhh
很明显, 对于next方法而言,nextLine方法是能完整读取到改行的所有内容,包括空格等,它是直接读到行尾才结束,然后回车,光标是直接定位到下一行。
5️⃣next()与nextLine()区别
所以这里就要来简单对比一下,二者方法有何区别啦。
- 对于next()方法:一定要读取到有效字符才可以结束输入,只读取空格前的内容,空格之后的内容不会被读取上,只有输入有效字符后才将后边输入的空格作为分隔符或者结束符。总之就是它不能得到有带空格的字符串。
- 对于nextLine()方法:以回车键作为结束符,可以获取到结束前所输入的一切字符串,包括空格、特殊字符等。
6️⃣实例
给你们模拟一个场景,如何如何监听用户输入为日期格式的有效数据?对于这么个小的单元测试,我觉得你们大家肯定都能轻松写上来,唯独可能就是需要校验日期格式,因为如何匹配,给大家个参考,可以使用这个方法,hasNext(String pattern),其中pattern参数支持传入一个正则表达式,其中对于yyyy-MM-dd的日期格式正则写法为:[ ^\\d{4}-\\d{2}-\\d{2}$ ]。
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个日期格式为:yyyy-MM-dd的字符串:");//判读输入格式是否为指定的日期格式if (scanner.hasNext("^\\d{4}-\\d{2}-\\d{2}$")) {System.out.println("输入的日期为:"+scanner.next());}else {System.out.println("输入的日期格式错误!");}}
接下来我们来测试验证一下:
请输入一个日期格式为:yyyy-MM-dd的字符串:
1
输入的日期格式错误!
请输入一个日期格式为:yyyy-MM-dd的字符串:
2022-06-29
输入的日期为:2022-06-29