首页 > 基础资料 博客日记
Java - 键盘录入Scanner类
2024-09-16 11:00:10基础资料围观108次
目录
我们要学的Scanner类是属于引用数据类型,我们先了解下引用数据类型。
引用数据类型的使用
与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式。
数据类型 变量名 = new 数据类型();
每种引用数据类型都有其功能,我们可以调用该类型实例的功能。
变量名.方法名();
1. Scanner类的介绍
Scanner类是一个用于扫描输入文本的新的实用程序。
Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据。
2. Scanner使用步骤:
导包:import java.util.Scanner;
创建对象实例:Scanner sc = new Scanner(System.in);
调用方法:
int i = sc.nextInt(); 用来接收控制台录入的数字
String s = sc.next(); 用来接收控制台录入的字符串
示例
package com.doit.day0217;
import java.util.Scanner;
/**
* @日期: 2024/4/13
* @Author: Wang NaPao
* @Blog: https://blog.csdn.net/weixin_40968325?spm=1018.2226.3001.5343
* @Tips: 和我一起学习吧
* @Description:
*/
public class Test10 {
public static void main(String[] args) {
//创建Scanner引用类型的变量
Scanner sc = new Scanner(System.in);
//获取数字
System.out.println("请输入一个数字");
int n=sc.nextInt();
System.out.println("n的值为"+n);
//获取字符串
System.out.println("请输入一个字符串");
String str=sc.next();
System.out.println("str的值为"+str);
}
}
3. Scanner类的各种数据类型
使用nextByte()、nextDouble()、nextFloat()、nextInt()、nextLong()、nextShort();
上述方法包括next和nextLine执行时都会造成堵塞,等待用户在命令行输入数据回车确认。
使用这些方法可以读取对应的数据类型直到空格,并且只读对应的数据类型,输入其他类型的值会报InputMismatchException异常。
4. 关闭Scanner类
使用完Scanner后,我们一定要记得将它关闭!
因为使用Scanner本质上是打开了一个IO流,如果不关闭的话,它将会一直占用系统资源。
但是注意一旦你关闭后,就算在sc.close()这行代码后你再重新new Scanner(System.in),那也不能重新再打开一个扫描器了,如下图发现程序会报错
所以大家一定要在用不到扫描器之后再关闭,即把sc.close()代码放到最后。
package Day1108;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);//读入
System.out.println("请输入一个整数");
BigInteger bi=sc.nextBigInteger();//读入一个Integer
System.out.println("bi="+bi);
sc.close();
Scanner sc1=new Scanner(System.in);
System.out.println("请输入一个整数");
BigInteger bi1=sc.nextBigInteger();//读入一个Integer
System.out.println("bi1="+bi1);
}
}
结果
5. next()和nextLine()的区别
从上面的讲解,我们会发现当我们想要输入的数据是String类型时,我们有两个方法可以调用,next()和nextLine().
那这两种方法具体有什么区别呢?
1)我们先来测试一下next():
package Day1108;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);//读入
String s=sc.next();
System.out.println(s);
}
}
结果:
从结果可以看出:
next()方法再识别输入的字符串时,不能得到我们输入的带有空格的字符串,只是读取到了Hello.
这说明next()在读取到有效字符之后会以空格作为自己的读取结束标识符,因为我们可以发现Hello前面的空格并没有影响到方法的读取。
所以next()用法总结如下:
-
一定要读取到有效字符之后才可以结束输入
-
对输入的有效字符后才能将其后面的输入的空白作为结束符
-
只有输入的有效字符后才将其后面输入的空白作为结束符
-
next()不能得到带有空格的字符串
-
读取结束后,该方法会将我们的鼠标定位在我们输入数据的那一行。
2)我们再来测试一下nextLine()
package Day1108;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);//读入
String s=sc.nextLine();
System.out.println(s);
}
}
结果
分析结果发现,输出结果与输入结果完全一致,nextLine()并没有被字符串中间的空格影响读取结果。
这是因为该方法以的是回车符(也就是我们键盘的enter键)作为结束标识符。
所以nextLine()用法总结:
-
以回车符作为结束标识符,获取到的是回车符前面输入的所有字符串(包括空格)
-
读取结束后,该方法会将我们的鼠标定位在我们输入数据的那一行的下一行。
6. hasNext和hasNextLine的区别
二者都是用于判断"有无键盘输入”的,有则返回true,没有则阻塞!
一定记住是阻塞而不是返回false,很多人都说是返回false,但你查源码会发现是不会返回false的,他会让你一直阻塞在判断阶段,二者只是在细节上有不同。
-
hasNext()方法会判断接下来是否有非空字符,如果有,则返回true,没有则阻塞。例如一直敲回车相当于一直判断为空字符,但是不会返回fasle,而是一直阻塞在判断阶段,直到你输入了非空字符。
-
hasNextLine()方法会根据行匹配模式取判断接下来是否有一行(包括空行),如果有,则返回true.这个没什么特别的,只要是你巧了回车那都是true并且不会阻塞。
🧀实例1
package Day1108;
import day1107.DemoTest07;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);
System.out.println(sc.hasNext());
}
}
结果:(按了很多个换行也无法结束,处于阻塞阶段)
🧀实例2:
package Day1108;
import day1107.DemoTest07;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);
System.out.println(sc.hasNextLine());
}
}
结果:
(直接按回车键也会为true)
总结:
-
next()方法不能录入空格,在特定情况下会把空格当作回车,nextLine方法可以录入空格
-
hasNext()和hasNextLine的返回值都是boolean类型,但只有可能返回true,不可能返回false,并且都默认以回车键为结束符(hasNext可以设置为任意符号位结束符,不在本文研究范围之内)
-
hasNext、next不能直接识别luo,而hasNextLine和nextLine都可以之别裸回车。换句话讲:对于不输入符号而直接裸敲一个回车的操作,只有后两个能识别到。
-
hasNext、hasNextLine在返回一个boolean类型结果为true的同时,会在堆空间中开辟一块专门用于存放刚刚输入的字符串,用于下次next或者nextLine:即下次next或者nextLine不需要再从键盘输入,相当于系统自动把刚刚输入的字符串再原封不动的输入了一遍。同时这个存储寿命=调用对象的寿命。
-
对于hasNext来说,每次敲击回车都相当于在堆空间中开辟一行,敲几次回车就会直接给后续next、nextLine方法赋值几次。
-
hasNext是线程阻塞的,对于hasNext来说,如果一直不输入字符,反而一直敲回车的话,整个线程会卡在这个输入的地方,直到有字符输入。
因为hasNext、hasNextLine与next、nextLine有2x2种组合方式,所以我们用4段代码做4次实验就可以大体上了解它们的特性了。
🧀1)hasNext和next组合
package Day1108;
import day1107.DemoTest07;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(sc.hasNext()){
System.out.println("第一次"+sc.next());
System.out.println("第二次"+sc.next());
System.out.println("第三次"+sc.next());
}
}
}
结果:
尝试输入:空格aaa空格bbb空格ccc回车
🧀2)hasNext和nextLine组合
package Day1108;
import day1107.DemoTest07;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(sc.hasNext()){
System.out.println("第一次"+sc.nextLine());
System.out.println("第二次"+sc.nextLine());
System.out.println("第三次"+sc.nextLine());
}
}
}
结果:
光标仍然闪烁,证明堆空间中的aaa bbb ccc只赋值给了第一个,这也验证了nextLine可以录入空格。此时线控正在等待用户输入第二个nextLine.
🧀3)hasNextLine和next组合
package Day1108;
import day1107.DemoTest07;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(sc.hasNextLine()){
System.out.println("第一次"+sc.next());
System.out.println("第二次"+sc.next());
System.out.println("第三次"+sc.next());
}
}
}
结果
🧀4)hasNextLine和nextLine组合
package Day1108;
import day1107.DemoTest07;
import java.util.Scanner;
public class BidDecimal01 {
public static void main(Stringargs) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(sc.hasNextLine()){
System.out.println("第一次"+sc.nextLine());
System.out.println("第二次"+sc.nextLine());
System.out.println("第三次"+sc.nextLine());
}
}
}
结果:
如果连续敲回车,那么hasNextLine也会判断为true,同时进入if语句执行。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:零门槛!人人可用的开源 BI 工具!
下一篇:找树左下角的值-513