一、Scanner简介
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。
下面是创建 Scanner 对象的基本语法:
Scanner sc = new Scanner(System.in);
二、scanner基本方法
2.1 next() 方法
/*通过 Scanner 类的 next() 方法获取输入的字符串,在读取前我们一般需要使用 hasNext判断是否还有输入的数据:*/
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 从键盘接收数据
// next方式接收字符串
System.out.println("next方式接收:");
// 判断是否还有输入
if (scan.hasNext()) {
String str1 = scan.next();
System.out.println("输入的数据为:" + str1);
}
scan.close();
}
}
/*
next方式接收:
wdnmd cnm
输入的数据为:wdnmd
*/
2.2 nextLine()方法
/*通过 Scanner 类的 nextLine() 方法获取输入的字符串,在读取前我们一般需要使用hasNextLine 判断是否还有输入的数据:*/
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 从键盘接收数据
// nextLine方式接收字符串
System.out.println("nextLine方式接收:");
// 判断是否还有输入
if (scan.hasNextLine()) {
String str2 = scan.nextLine();
System.out.println("输入的数据为:" + str2);
}
scan.close();
}
}
/*
next方式接收:
wdnmd cnm
输入的数据为:wdnmd cnm
*/
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法验证数据类型,再使用 nextXxx() 来读取:
//输入多个数字,求其总和与平均数,每输入一个数字用回车确认,通过输入非数字结束输入并输出执行结果:
import java.util.Scanner;
class RunoobTest {
public static void main(String[] args) {
System.out.println("请输入数字:");
Scanner scan = new Scanner(System.in);
double sum = 0;
int m = 0;
while (scan.hasNextDouble()) {
double x = scan.nextDouble();
m = m + 1;
sum = sum + x;
}
System.out.println(m + "个数的和为" + sum);
System.out.println(m + "个数的平均值是" + (sum / m));
scan.close();
}
}
/*
请输入数字:
12
23
15
21.4
end
4个数的和为71.4
4个数的平均值是17.85
*/
2.3 Console()方法
/*输入的时候字符都是可见的,所以Scanner类不适合从控制台读取密码。从Java SE 6开始特别引入了Console类来实现这个目的。若要读取一个密码,可以采用下面这段代码:*/
Console cons = System.console();
String username = cons.readline("User name: ");
char[] passwd = cons.readPassword("Password: ");
/*为了安全起见,返回的密码存放在一维字符数组中,而不是字符串中。在对密码进行处理之后,应该马上用一个填充值覆盖数组元素。采用Console对象处理输入不如采用Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或者一个数值的方法。*/
2.4 StringTokenizer()方法
//通过StringTokenizer类可以分解输入的整行得到的带空格的字符串。默认情况下,StringTokenizer以空格,制表符,换行符和回车符作为分割依据。
import java.util.Scanner;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入数据:");
StringTokenizer stringTokenizer=new StringTokenizer(scanner.nextLine());
System.out.println("分隔后:");
while(stringTokenizer.hasMoreTokens()){
System.out.println(stringTokenizer.nextToken());
}
}
}
/*
输入数据:
runoob com
分隔后:
runoob
com
*/
2.5 hasNextXxx() 方法
//1、简单的处理逻辑
public class inputInformation {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的姓名");
String name = scan.nextLine();//接收一个字符串,可以加除Enter以外的所有符号
System.out.println("请输入你的ID");
String ID ;
while(scan.hasNextLine()) {//判断当前是否有输入,当键盘有输入后执行循环
if(scan.hasNextInt()) {// 判断输入的值是否为整数类型,当为整数类型时执行循环
ID = scan.nextLine();
System.out.println("你输入的姓名为:"+name);
System.out.println("你输入的ID为:"+ID);
break;//接收并打印后直接跳出循环
}else {
System.out.println("请输入数字");
ID = scan.nextLine();
continue;
}
}
}
}
/*
请输入你的姓名
Y
请输入你的ID
q20
请输入数字
520
*/
/*2、处理接受整理和小数的逻辑时,需要在 else 的分支逻辑里把非整数的输入接收走,否则会影响后续 hasNextFloat()【随便非整型数据】 判断和接受小数的逻辑*/
public class logicAssess {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
// 从键盘接收数据
int i = 0;
float f = 0.0f;
System.out.print("输入整数:");
if (scan.hasNextInt()) {
// 判断输入的是否是整数
i = scan.nextInt();
// 接收整数
System.out.println("整数数据:" + i);
} else {
// 如果后面需要继续判断 hasNextFloat()【随便非整型数据】便需要加上这句话
scan.nextLine();
System.out.println("输入的不是整数!");
}
}
参考资料:菜鸟教程 - 学的不仅是技术,更是梦想!