Scanner 是 Java java.util 包中的一个类,它是一个简单的文本扫描器,可以使用正则表达式解析基本类型和字符串。Scanner 的主要功能是从输入源(如控制台、文件、字符串等)中读取数据。

Scanner 的基本用法
1 导入 Scanner 类
在使用 Scanner 之前,必须先导入它:
import java.util.Scanner;
2 创建 Scanner 对象
Scanner 需要一个“输入源”来创建对象,最常见的是从标准输入流(键盘)读取:
// 创建一个 Scanner 对象,用于从 System.in(标准输入流,即键盘)读取数据 Scanner scanner = new Scanner(System.in);
3 使用 nextXxx() 方法读取数据
Scanner 提供了一系列 nextXxx() 方法来读取不同类型的数据,这些方法会跳过输入中的空白符(空格、Tab、换行等),直到找到下一个非空白符。
| 方法 | 描述 | 示例 |
|---|---|---|
next() |
读取下一个单词(以空白符为分隔符)。 | String name = scanner.next(); |
nextLine() |
读取一整行(以换行符 \n 为结束符)。 |
String line = scanner.nextLine(); |
nextInt() |
读取一个 int 类型的整数。 |
int age = scanner.nextInt(); |
nextDouble() |
读取一个 double 类型的浮点数。 |
double price = scanner.nextDouble(); |
nextBoolean() |
读取一个 boolean 类型的值。 |
boolean flag = scanner.nextBoolean(); |
nextLong() |
读取一个 long 类型的整数。 |
long id = scanner.nextLong(); |
nextByte() |
读取一个 byte 类型的整数。 |
byte b = scanner.nextByte(); |
nextShort() |
读取一个 short 类型的整数。 |
short s = scanner.nextShort(); |
nextFloat() |
读取一个 float 类型的浮点数。 |
float f = scanner.nextFloat(); |
4 关闭 Scanner
为了释放系统资源,使用完 Scanner 后应该关闭它。Scanner 关闭后,它所关联的输入流也会被关闭。

scanner.close();
完整示例:从键盘读取输入
这是一个最经典的示例,演示了如何从键盘读取用户名和年龄。
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
// 1. 创建 Scanner 对象
Scanner scanner = new Scanner(System.in);
// 2. 提示用户输入
System.out.print("请输入您的姓名: ");
// 3. 读取一个单词(遇到空格会停止)
String name = scanner.next();
System.out.print("请输入您的年龄: ");
int age = scanner.nextInt();
// 4. 输出结果
System.out.println("您好, " + name + "!");
System.out.println("您今年 " + age + " 岁。");
// 5. 关闭 Scanner
scanner.close();
}
}
运行示例:
请输入您的姓名: 张三 李四
请输入您的年龄: 25
您好, 张三!
您今年 25 岁。
注意: next() 只读取了 "张三","李四" 留在了输入缓冲区中,这可能会导致后续的输入读取问题。
next() 和 nextLine() 的区别(常见陷阱)
这是 Scanner 使用中最容易出错的地方。

next(): 读取到空白符(空格、Tab、回车)就停止。nextLine(): 读取到换行符(回车)才停止。
问题示例:
import java.util.Scanner;
public class ScannerTrap {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的姓名: ");
String name = scanner.next(); // 用户输入 "张三" 并按回车
System.out.print("请输入您的地址: ");
String address = scanner.nextLine(); // 这里会直接跳过,读取到上一个回车
System.out.println("姓名: " + name);
System.out.println("地址: " + address); // 输出为空
scanner.close();
}
}
为什么会这样?
- 当你输入
张三并按下回车时,scanner.next()读取了 "张三"。 - 回车符
\n还留在输入缓冲区中。 - 当程序执行到
scanner.nextLine()时,它发现缓冲区的第一个字符就是换行符\n,于是它认为这是一行空行,并立即读取完毕,address的值就是空字符串。
如何解决?
在 next() 后面加一个 nextLine() 来消耗掉多余的换行符
System.out.print("请输入您的姓名: ");
String name = scanner.next(); // 读取 "张三"
scanner.nextLine(); // 消耗掉输入缓冲区中的 \n
System.out.print("请输入您的地址: ");
String address = scanner.nextLine(); // 正常读取 "北京市朝阳区"
统一使用 nextLine(),然后手动分割
如果不确定输入内容是否包含空格,统一使用 nextLine() 是更健壮的做法,然后用 String 的 split() 方法或自己处理逻辑来分割数据。
System.out.print("请输入您的姓名和年龄(用空格隔开): ");
String inputLine = scanner.nextLine(); // 读取一整行,"张三 25"
String[] parts = inputLine.split(" "); // 按空格分割
String name = parts[0];
int age = Integer.parseInt(parts[1]);
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
从文件读取数据
Scanner 不仅可以读取键盘输入,还可以读取文件,只需要在创建 Scanner 对象时传入一个 File 对象或 FileReader 对象即可。
步骤:
- 导入
java.io.File,java.io.FileNotFoundException和java.util.Scanner。 - 创建
File对象,指定文件路径。 - 用
File对象创建Scanner。 - 使用
hasNextXxx()方法循环判断是否还有下一种类型的输入。 - 读取数据并处理。
- 关闭
Scanner。
示例:
假设有一个名为 data.txt 的文件,内容如下:
Hello World
10
3.14
true
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerFileExample {
public static void main(String[] args) {
try {
// 1. 创建 File 对象
File file = new File("data.txt");
// 2. 创建 Scanner 对象,关联文件
Scanner fileScanner = new Scanner(file);
// 3. 循环读取文件内容
while (fileScanner.hasNext()) {
if (fileScanner.hasNextLine()) {
System.out.println("读取到一行: " + fileScanner.nextLine());
}
if (fileScanner.hasNextInt()) {
System.out.println("读取到一个整数: " + fileScanner.nextInt());
}
if (fileScanner.hasNextDouble()) {
System.out.println("读取到一个浮点数: " + fileScanner.nextDouble());
}
if (fileScanner.hasNextBoolean()) {
System.out.println("读取到一个布尔值: " + fileScanner.nextBoolean());
}
}
// 4. 关闭 Scanner
fileScanner.close();
} catch (FileNotFoundException e) {
System.err.println("错误:找不到文件 " + e.getMessage());
e.printStackTrace();
}
}
}
输出结果:
读取到一行: Hello World
读取到一个整数: 10
读取到一个浮点数: 3.14
读取到一个布尔值: true
常用方法总结
| 方法 | 描述 |
|---|---|
hasNext() |
判断输入源中是否还有下一个单词。 |
hasNextLine() |
判断输入源中是否还有下一行。 |
hasNextInt(), hasNextDouble() 等 |
判断输入源中下一个标记是否可以转换为指定的类型。 |
next(), nextLine() 等 |
读取并返回下一个标记。 |
useDelimiter(Pattern pattern) |
设置此扫描器的分隔模式。scanner.useDelimiter(","); 可以按逗号分割。 |
close() |
关闭此扫描器。 |
Scanner是 Java 中进行文本输入的利器,简单易用。- 核心是创建对象、读取数据、关闭对象。
next()和nextLine()的区别是最大的坑,务必理解清楚。Scanner不仅可以用于控制台输入,也可以用于文件读取,功能非常灵活。
