Scanner 是什么?
Scanner 是 Java java.util 包中的一个工具类,它的主要作用是“获取用户的输入”。

你可以把它想象成一个“扫描仪”或者“读取器”,它可以扫描(读取)不同来源的数据,
- 你在键盘上输入的内容
- 一个文本文件(.txt)中的内容
- 一张图片或一个网络连接中的数据
Scanner 会将读取到的原始数据流(比如一连串的字符),根据你的需要,解析成不同的基本数据类型,
- 整数 (
int) - 浮点数 (
double,float) - 单个字符 (
char) - 一行字符串 (
String) - 布尔值 (
boolean)
Scanner 的核心功能就是“输入”和“解析”。
如何使用 Scanner (基本步骤)
使用 Scanner 通常遵循固定的三步曲:

导入包 (Import)
因为 Scanner 位于 java.util 包中,所以你需要在 Java 文件的顶部使用 import 语句来引入它。
import java.util.Scanner; // 导入 Scanner 类
创建对象 (Create an Instance)
创建一个 Scanner 对象,并告诉它要从哪里读取数据,最常见的用法是从标准输入流(也就是键盘)读取。
// System.in 代表标准输入流,即键盘 Scanner scanner = new Scanner(System.in);
使用方法获取输入 (Use Methods to Get Input)
调用 Scanner 对象的各种方法来获取你想要的类型的数据。
// 示例:获取一个整数
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt(); // 读取一个整数
System.out.println("你的年龄是: " + age);
// 示例:获取一行字符串
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 读取一行
System.out.println("你好, " + name);
常用方法详解
Scanner 提供了丰富的方法来读取不同类型的数据,下面是一些最常用的:

| 方法 | 描述 | 示例 |
|---|---|---|
next() |
读取下一个单词(以空格为分隔符)。 | String word = scanner.next(); |
nextLine() |
读取一整行字符串(以回车 \n 为分隔符)。 |
String line = scanner.nextLine(); |
nextInt() |
读取一个 int 类型的整数。 | int num = scanner.nextInt(); |
nextDouble() |
读取一个 double 类型的浮点数。 | double price = scanner.nextDouble(); |
nextBoolean() |
读取一个 boolean 类型的值。 | boolean flag = scanner.nextBoolean(); |
hasNext() |
判断是否还有下一个单词可以读取。 | if (scanner.hasNext()) { ... } |
hasNextLine() |
判断是否还有下一行字符串可以读取。 | while (scanner.hasNextLine()) { ... } |
重要注意事项和常见问题
next() 和 nextLine() 的区别 (最容易出错的地方)
这是新手最常遇到的问题,理解它们的区别至关重要。
-
next():- 读取到空格、Tab键或回车键时,就认为输入结束。
- 不会消耗掉输入行末尾的回车符
\n,这个回车符会留在输入缓冲区中。
-
nextLine():- 读取到回车键
\n时,才认为一行输入结束。 - 会消耗掉输入行末尾的回车符
\n。
- 读取到回车键
常见问题场景:
如果你先使用 nextInt() 或 next(),再用 nextLine(),可能会发现 nextLine() 被跳过了。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt(); // 用户输入 "18" 并按回车
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 这里会直接跳过,读取不到用户输入!
System.out.println("年龄: " + age);
System.out.println("名字: " + name);
为什么会这样?
当用户输入 18 并按回车时,scanner.nextInt() 读取了数字 18,但回车符 \n 仍然留在输入缓冲区中,紧接着,scanner.nextLine() 被调用,它会立刻读取缓冲区中剩下的那个 \n,并认为这是一行空字符串,然后执行结束,所以程序就跳过了等待用户输入名字的步骤。
如何解决?
在 nextInt() 或 next() 之后,调用一个 nextLine() 来“消耗掉”那个多余的回车符。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt();
scanner.nextLine(); // 【关键】消耗掉nextInt()后留下的回车符
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 现在可以正常等待输入了
System.out.println("年龄: " + age);
System.out.println("名字: " + name);
关闭 Scanner
Scanner 底层会占用系统资源(如文件句柄、I/O流等),当你不再需要使用它时,最好关闭它以释放资源。
scanner.close(); // 关闭 Scanner
注意:一旦 scanner 被关闭,它就不能再被使用了,如果你希望一个 Scanner 对象贯穿整个程序的生命周期,可以在程序结束时再关闭它。
完整示例代码
下面是一个综合示例,演示了如何处理整数、浮点数和字符串,并处理了 next() 和 nextLine() 的潜在问题。
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
// 1. 创建 Scanner 对象,用于读取键盘输入
Scanner scanner = new Scanner(System.in);
// --- 获取整数 ---
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt();
// 消耗掉nextInt()后的回车符
scanner.nextLine();
// --- 获取浮点数 ---
System.out.print("请输入你的身高 (米): ");
double height = scanner.nextDouble();
// 消耗掉nextDouble()后的回车符
scanner.nextLine();
// --- 获取字符串 (一整行) ---
System.out.print("请输入你的家乡: ");
String hometown = scanner.nextLine();
// --- 获取字符串 (一个单词) ---
System.out.print("请输入你的爱好: ");
String hobby = scanner.next();
// 2. 打印结果
System.out.println("\n--- 你的信息 ---");
System.out.println("年龄: " + age);
System.out.println("身高: " + height + " 米");
System.out.println("家乡: " + hometown);
System.out.println("爱好: " + hobby);
// 3. 关闭 Scanner
scanner.close();
}
}
Scanner 是 Java 中一个简单、强大且易于使用的输入工具,记住以下几点,你就能很好地掌握它:
- 用途:用于获取用户输入,并将其解析成各种基本数据类型。
- 步骤:
import->new Scanner(...)->调用方法。 - 关键:理解
next()和nextLine()的区别,注意处理它们之间的回车符问题。 - 好习惯:用完之后
close()掉Scanner对象。
