Day11-Scanner
Day11-Scanner
Scanner介绍
Scanner 对象:
之前我们学的基本语法中我们并没有实现程序和人的交互,但是 Java 给我们提供了这样一个工具类,我们可以获取用户的输入。
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
基本语法:
Scanner s = new Scanner(System.in);
通过 Scanner 类的 next()与 nextLine()方法获取输入的字符串:在读取前我们一般需要使用 hasNext()与 hasNextLine()判断是否还有输入的数据。
java.util.Scanner 的解读:
“java.util.Scanner” 是 Java 编程语言中的一个类。
“java.util” 是 Java 标准库中的一个包(package)名称,这个包中包含了很多实用的工具(utility)类和接口。
“Scanner” 是其中的一个类,它主要用于从标准输入(通常是键盘输入)、文件等来源中读取数据。它提供了方便的方法来解析各种基本数据类型和字符串。
next()与 nextLine()方法分别的用法
一、next()
方法
-
next()
方法会从输入流中读取下一个单词(以空白字符分隔)。 -
它会在遇到空白字符(如空格、制表符、换行符等)时停止读取,并返回当前读取到的内容。
-
假设用户输入 “hello world”,
next()
方法只会读取到 “hello”,因为它在遇到第一个空白字符时就停止了读取。//创建一个扫描器对象,用于接收键盘数据 Scanner scanner = new Scanner(System.in); System.out.println("使用next方法接收:"); //判断用户有没有输出字符串 if(scanner.hasNext()){ //使用next方法接收——接收单个单词关闭 String str=scanner.next(); //程序会等到用户输入 System.out.println("输入的内容为:"+str); } //属于IO流的类,用完就关闭,否则一直占用资源!!!!!!!!!!!! scanner.close();//关闭
输入Hello world时,只输出一个Hello
使用next方法接收: Hello world 输入的内容为:Hello
二、nextLine()
方法
nextLine()
方法会读取输入流中的一整行内容,包括空白字符。- 它会读取到当前行的末尾(换行符处),并返回包括换行符之前的所有字符。
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextline方法接收:");
if(scanner.hasNextLine()){
String str = scanner.nextLine();
System.out.println("输出的结果为:"+str);
}
scanner.close();
hasNext()
在 Java 中,Scanner
类的hasNext()
方法用于判断输入流中是否还有下一个输入项(token)。
具体解释如下:
一、返回值及用途
- 返回值类型:这个方法返回一个布尔值。如果输入流中还有下一个输入项可读取,它就返回
true
;如果没有更多的输入项可读取,它就返回false
。 - 常见用途:通常在一个循环中使用这个方法来不断检查是否有更多的输入,以便决定是否继续读取输入。
二、输入项的概念
- 定义:输入项是指通过输入流提供的、以分隔符(如空格、换行符等)分隔的一块数据。具体的分隔规则取决于
Scanner
的构造方式和默认的分隔模式。 - 示例:如果用户在控制台输入 “hello world”,这里面的 “hello” 和 “world” 可以分别被看作两个输入项。如果输入的是一个整数,那么这个整数就是一个输入项。
三、与其他方法配合使用
- 与
next()
方法配合:通常在使用next()
方法读取输入项之前,先使用hasNext()
方法进行判断,以确保不会在没有输入项可读取时调用next()
方法而导致异常。
遇见某一个类,选中,按住Ctrl键,单击鼠标,就进入了类的源代码
实际应用:判断输入的是不是整数/小数
Scanner scanner = new Scanner(System.in);
//从键盘接收数据
int i1=0;
float i2=0.0f;
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
i1 = scanner.nextInt();
System.out.println("输入的整数是:"+i1);
}else {System.out.println("你输入的不是整数");}
System.out.println("请输入小数:");
if(scanner.hasNextFloat()){
i2 = scanner.nextFloat();
System.out.println("输入的小数是:"+i2);
}else {System.out.println("你输入的不是小数");}
scanner.close();
易出错的地方:
//判断输入的是不是小数
Scanner scanner = new Scanner(System.in);
System.out.println("请输入小数:");
if(scanner.hasNextDouble()){
double a= scanner.nextDouble();
System.out.println("输入的小数是:"+a);
}else {
System.out.println("这个书不是小数");
}
Scanner close;
//输入的是12345,是一个整数,应该输出的是"这个书不是小数",但是输出的是12345.0。
//出错了!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//当你在Java中使用Scanner类的nextDouble()方法来读取输入时,即使用户输入的是一个整数值(如 12345),这个方法也会将它当作双精度浮点数(double)来读取和处理。这意味着,无论输入的是整数还是真正的小数,只要它是有效的数值,都会被当作带有小数点的格式存储在 double 变量中。因此,整数 12345 会被读入并显示为 12345.0。
//解决思路:如果你想要区分用户输入的是整数还是小数,就需要在读取之后做一些额外的检查,比如比较该值是否与其强制转换为 int 类型的值相等。如果两者相等,则说明输入的是一个整数;否则,就是一个小数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
if (scanner.hasNextDouble()) {
double input = scanner.nextDouble();
// 如果input和它的整数部分相等,那么它就是一个整数
if (input == (int) input) {
System.out.println("这个数不是小数");
} else {
System.out.println("输入的小数是:" + input);
}
} else {
System.out.println("输入的不是一个有效的数字!");
}
scanner.close();
}
}
实际应用:将输入的数据求和、求平均值
//我们可以输入多个数字,并求其总和与平均数。每输入一个数字用回车确认。通过输入非数字来结束输入并输出执行结果。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
//和
double sum=0;
//有多少个数
int num=0;
//通过循环判断是否有数字,并进行求和和数量统计
while(scanner.hasNextDouble()){
sum+=scanner.nextDouble();
num=num+1;//num++
System.out.println("你输入了第"+num+"个数,当前的和是"+sum);
}
System.out.println(num+"个数的和是"+sum);
System.out.println(num+"个数的平均数:"+(sum/num));
scanner.close();