Java 基础补充:Scanner 类详解
1. Scanner 是什么?
Scanner 是 Java 提供的一个用于获取用户输入 的工具类,它位于 java.util 包中。通过 Scanner,我们可以轻松地从键盘读取整数、小数、字符串等不同类型的数据,而无需自己处理复杂的输入流。
为什么需要 Scanner?
在命令行程序中,我们经常需要与用户交互:程序向用户提出问题,用户通过键盘输入答案,程序再根据输入做出响应。如果没有 Scanner,我们需要使用较底层的 System.in 和复杂的字节流处理,非常麻烦。Scanner 封装了这些细节,提供了简洁的 API。
2. 如何使用 Scanner?
2.1 导入 Scanner 类
因为 Scanner 在 java.util 包中,使用前需要导入:
java
import java.util.Scanner;
2.2 创建 Scanner 对象
要读取键盘输入,我们需要创建一个 Scanner 对象,并指定输入源为 System.in(标准输入,即键盘)。
java
Scanner scanner = new Scanner(System.in);
System.in 是 Java 提供的标准输入流,默认连接键盘。
2.3 读取不同类型的数据
Scanner 提供了多个方法来读取不同类型的数据:
| 方法 | 返回值类型 | 说明 |
|---|---|---|
nextInt() |
int |
读取一个整数 |
nextDouble() |
double |
读取一个浮点数 |
nextLine() |
String |
读取一行字符串(包括空格) |
next() |
String |
读取一个单词(以空白字符分隔) |
nextBoolean() |
boolean |
读取一个布尔值(true/false) |
nextByte() |
byte |
读取一个字节 |
nextShort() |
short |
读取一个短整数 |
nextLong() |
long |
读取一个长整数 |
nextFloat() |
float |
读取一个单精度浮点数 |
这些方法都会阻塞等待用户输入,直到用户输入内容并按回车。
2.4 简单示例
java
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的姓名:");
String name = scanner.nextLine();
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.print("请输入你的身高(米):");
double height = scanner.nextDouble();
System.out.println("你好," + name + ",你今年 " + age + " 岁,身高 " + height + " 米。");
scanner.close(); // 关闭扫描器,释放资源
}
}
运行示例:
请输入你的姓名:张三
请输入你的年龄:25
请输入你的身高(米):1.75
你好,张三,你今年 25 岁,身高 1.75 米。
3. 注意事项
3.1 读取完数字后读取字符串的问题
当使用 nextInt()、nextDouble() 等读取数字后,输入缓冲区中会残留一个换行符(用户按回车产生的 \n)。如果紧接着使用 nextLine(),它会直接读取这个残留的换行符,导致读取到空字符串。
错误示例:
java
System.out.print("请输入年龄:");
int age = scanner.nextInt();
System.out.print("请输入姓名:");
String name = scanner.nextLine(); // 直接读到空字符串,不会等待用户输入
解决方法 :在数字读取后,先调用一次 nextLine() 消耗掉换行符,或者都使用 nextLine() 读取后再转换。
java
System.out.print("请输入年龄:");
int age = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
System.out.print("请输入姓名:");
String name = scanner.nextLine();
或者都用 nextLine() 然后手动转换:
java
System.out.print("请输入年龄:");
int age = Integer.parseInt(scanner.nextLine());
3.2 输入类型不匹配的异常
如果用户输入的内容与期望的类型不符(例如要求输入整数却输入了字母),Scanner 会抛出 InputMismatchException。因此在实际开发中,通常需要加入异常处理或验证。
3.3 关闭 Scanner
当 Scanner 不再使用时,建议调用 close() 方法释放与之关联的资源。注意:关闭 Scanner 的同时也会关闭其输入流(System.in),关闭后就不能再使用 System.in 读取输入了。所以一般在程序最后关闭。
4. Scanner 的其他用法
除了读取键盘输入,Scanner 还可以读取文件、字符串等。例如:
- 读取字符串 :
Scanner sc = new Scanner("Hello World"); - 读取文件 :
Scanner sc = new Scanner(new File("data.txt"));
这为我们处理不同来源的数据提供了统一的方式。
5. 总结
Scanner是 Java 提供的一个方便读取输入的类,位于java.util包。- 通过
new Scanner(System.in)创建对象来读取键盘输入。 - 提供了
nextInt()、nextLine()等方法读取不同类型的数据。 - 注意数字读取后残留换行符的问题,以及输入类型不匹配的异常。
- 使用完毕后建议关闭
Scanner。
掌握 Scanner,你就能轻松地编写交互式命令行程序,让程序"活"起来!