超详细的Scanner类及方法解析
说明:文章部分参考菜鸟驿站
介绍
Scanner 是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空格匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
头文件
java.util.Scanner
初始化
初始化Scanner对象
Scanner sc = new Scanner(System.in)
方法
next()
接收以空格结束的字符串。
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
System.out.println("用next方式接收数据:");
if(sc.hasNext()){
String str=sc.next();
System.out.println("输入的数据是"+str);
}
sc.close();
}
实际输入:Hello word
实际接收:Hello
发现word并没有接收到str中,接下来看看nextLine()
nextLine()
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
System.out.println("用nextLine方式接收数据:");
if(sc.hasNext()){
String str=sc.nextLine();
System.out.println("输入的数据是:"+str);
}
sc.close();
}
实际输入:Hello word
实际接收:Hello word
注意
当使用nextLine()之前使用过任何以enter为结束的方法时,nextLine()会得到空值。
假设先使用next(),再使用nextLine()
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
if(sc.hasNext()){
String str0 =sc.next();
String str1=sc.nextLine();
String str2=sc.nextLine();
System.out.println("输入的数据是str0:"+str0);
System.out.println("输入的数据是str1:"+str1);
System.out.println("输入的数据是str2:"+str2);
}
sc.close();
}
发现只允许让输入两个字符串就结束了!那是因为在输入I之后按了enter,导致计算机以为你输了下一个字符串给str1,并且这个值是空,然后你再输入love,计算机就给了str2.
1.如何解决这个问题??
在str0 和str1中间使用sc.nextLine()接收走输入str0之后的无效enter
2.那为什么不再在str1和str2中间使用sc.nextLine(),接收走输入str1之后的无效enter?
因为str0是以next()方法接收的,next()下面会说到,是以空格结束的,只取空格之前的字符串,所以会剩下\n,
而str1是以nextLine()方式接收的,是以\n为结束符,并把\n一并带走,不会留下\n,所以输入完str1之后的enter不会对下一个str2有影响。
3.那next()会把自己的空格收走吗?
我测试的答案是不会,如下是我的测试代码
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
if(sc.hasNext()){
String str0 =sc.next();
//接收输入str0之后的无效enter
//sc.nextLine();
String str1=sc.nextLine();
String str2=sc.nextLine();
System.out.println("输入的数据是str0:"+str0);
System.out.println("输入的数据是str1:"+str1);
System.out.println("输入的数据是str2:"+str2);
}
sc.close();
}
我的输入是i 5个空格 34 enter 2
我以为str0=I,str1=4个空格34,str2=2;
但实际是str0=I,str1=5个空格34,str2=2;
说明next()没有收走空格结束符。
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
if(sc.hasNext()){
String str0 =sc.next();
//接收输入str0之后的无效enter
sc.nextLine();
String str1=sc.nextLine();
String str2=sc.nextLine();
System.out.println("输入的数据是str0:"+str0);
System.out.println("输入的数据是str1:"+str1);
System.out.println("输入的数据是str2:"+str2);
}
sc.close();
}
假设先使用nextInt(),再使用nextLine()
同理,需要接收int与字符串间的无效enter
next()与nextLine()区别
next()
- 一定要读到有效字符菜可以结束输入
- 对输入的有效字符之前遇到的空格,会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或结束符
- 该方法不能得到具有空格的字符串
nextLine()
-以\n为结束符,该方法返回的是输入回车enter之前的所有字符串
-可以获得空白
nextInt()
接收int型数据
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
System.out.println("用nextInt方式接收数据:");
if(sc.hasNext()){
int str=sc.nextInt();
System.out.println("输入的数据是:"+str);
}
sc.close();
}
public static void main(String[] args){
//从键盘接收数据
Scanner sc = new Scanner(System.in);
System.out.println("用nextInt方式接收数据:");
if(sc.hasNext()){
int str=sc.nextInt();
//接收输入str之后的无效enter
sc.nextLine();
String str1=sc.nextLine();
String str2=sc.nextLine();
System.out.println("输入的数据是str1:"+str1);
System.out.println("输入的数据是str2:"+str2);
}
sc.close();
}
其他接收方法
同理,其他接受方式如下
- nextFloat()
- nextDouble()
- nextLong()
- nextBoolean()
-…
hasNext()
如果此扫描器的输入中有另一个标记,则返回 true,否则false
hasNextLine()
如果在此扫描器的输入中存在另一行,返回true,否则false
hasNextInt()
如果此扫描器的输入中有另一个标记,该标记是int,则返回 true。