Scanner 是什么?
Scanner 是一个文本扫描器,它可以:

- 读取用户输入:从键盘(标准输入流
System.in)读取数据。 - 解析文件内容:从文件中读取并解析数据。
- 将输入分解为标记(Tokens):默认情况下,
Scanner使用空白字符(空格、制表符、换行符等)作为分隔符,将输入分割成一个个的“标记”(Token)。 - 将标记转换为基本数据类型:可以将标记(字符串)转换为
int,double,boolean,long等基本数据类型。
如何使用 Scanner
1 导入包
你需要在代码文件的开头导入 Scanner 类。
import java.util.Scanner; // 导入 Scanner 类
2 创建 Scanner 对象
创建 Scanner 对象时,你需要告诉它从哪里读取数据。
-
从键盘输入读取(最常用):
System.in代表标准输入流,也就是键盘。Scanner scanner = new Scanner(System.in);
-
从文件读取: 你需要先创建一个
File对象,然后将其传递给Scanner。
(图片来源网络,侵删)import java.io.File; import java.io.FileNotFoundException; File file = new File("my_data.txt"); Scanner fileScanner = new Scanner(file); // 如果文件不存在,会抛出 FileNotFoundException
3 常用方法
创建好 Scanner 对象后,就可以使用它的方法来读取和解析数据了。
| 方法 | 描述 |
|---|---|
next() |
读取下一个标记(直到遇到空白符)。注意:不会读取换行符。 |
nextLine() |
读取一整行输入(直到遇到换行符 \n)。 |
nextInt() |
读取下一个标记并将其转换为 int 类型。 |
nextDouble() |
读取下一个标记并将其转换为 double 类型。 |
nextBoolean() |
读取下一个标记并将其转换为 boolean 类型。 |
hasNext() |
判断是否还有下一个标记。 |
hasNextLine() |
判断是否还有下一行输入。 |
close() |
非常重要!关闭 Scanner,释放系统资源(如文件句柄)。 |
实用代码示例
示例 1:读取用户输入的字符串
使用 next() 和 nextLine() 的区别非常关键。
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字: ");
String name = scanner.next(); // 读取一个单词
System.out.println("你好, " + name + "!");
System.out.print("请输入你的全名: ");
// scanner.nextLine(); // 这一行很重要!它会消耗掉上一个 next() 后留下的换行符
String fullName = scanner.nextLine(); // 读取一整行
System.out.println("你的全名是: " + fullName);
scanner.close();
}
运行结果分析:
请输入你的名字: 张三
你好, 张三!
请输入你的全名: 你的全名是:
你会发现 nextLine() 直接读取了空行,这是因为 next() 读取 "张三" 后,光标停留在 "张三" 后面的换行符 \n 上。nextLine() 遇到这个换行符,就认为读取了一行空内容,然后执行完毕。

修正后的代码(解决换行符问题):
import java.util.Scanner;
public class ScannerExampleFixed {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字: ");
String name = scanner.next();
System.out.println("你好, " + name + "!");
// 添加这行来消耗掉换行符
scanner.nextLine();
System.out.print("请输入你的全名: ");
String fullName = scanner.nextLine();
System.out.println("你的全名是: " + fullName);
scanner.close();
}
修正后的运行结果:
请输入你的名字: 张三
你好, 张三!
请输入你的全名: 张三同学
你的全名是: 张三同学
当你连续使用 next(), nextInt() 等方法后,如果后面想用 nextLine(),最好在它们之间加一个 scanner.nextLine() 来“吸收”掉那个多余的换行符。
示例 2:读取不同类型的数据
import java.util.Scanner;
public class ScannerTypes {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt();
System.out.println("你明年 " + (age + 1) + " 岁。");
System.out.print("请输入你的身高(米): ");
double height = scanner.nextDouble();
System.out.println("你的身高是: " + height + " 米。");
// 消耗掉 nextDouble() 后的换行符
scanner.nextLine();
System.out.print("请输入你的性别: ");
String gender = scanner.nextLine();
System.out.println("你的性别是: " + gender);
scanner.close();
}
运行示例:
请输入你的年龄: 25
你明年 26 岁。
请输入你的身高(米): 1.75
你的身高是: 1.75 米。
请输入你的性别: 男
你的性别是: 男
示例 3:循环读取直到用户输入特定值
使用 hasNext() 或 hasNextLine() 来判断是否还有输入。
import java.util.Scanner;
public class ScannerLoop {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一些单词,输入 'quit' 结束:");
while (scanner.hasNext()) { // 只要还有下一个标记,就循环
String word = scanner.next();
if (word.equals("quit")) {
break; // 如果输入的是 'quit',则退出循环
}
System.out.println("你输入了: " + word);
}
scanner.close();
}
运行示例:
请输入一些单词,输入 'quit' 结束:
hello
你输入了: hello
world
你输入了: world
java
你输入了: java
quit
示例 4:从文件读取数据
假设有一个名为 numbers.txt 的文件,内容如下:
10
3.14
Hello
20
5.67
World
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerFile {
public static void main(String[] args) {
try {
File file = new File("numbers.txt");
Scanner scanner = new Scanner(file);
System.out.println("正在读取文件内容...");
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("读取到一行: " + line);
}
scanner.close();
} catch (FileNotFoundException e) {
System.out.println("错误: 文件未找到!");
e.printStackTrace();
}
}
}
运行结果:
正在读取文件内容...
读取到一行: 10
读取到一行: 3.14
读取到一行: Hello
读取到一行: 20
读取到一行: 5.67
读取到一行: World
最佳实践和注意事项
-
总是关闭
Scanner:Scanner底层会持有一些系统资源(如文件流),如果不关闭,可能会导致资源泄露,使用try-with-resources语句是最佳实践,它可以自动关闭实现了AutoCloseable接口(Scanner实现了该接口)的资源。// 推荐方式:try-with-resources try (Scanner scanner = new Scanner(System.in)) { // 在这里使用 scanner System.out.print("请输入一个数字: "); int num = scanner.nextInt(); System.out.println("你输入的数字是: " + num); } // scanner.close() 会在这里自动被调用 -
处理输入异常:当用户输入的数据类型和你期望的不符时(比如你用
nextInt()读取 "abc"),程序会抛出InputMismatchException,你需要用try-catch来处理这些异常。Scanner scanner = new Scanner(System.in); System.out.print("请输入一个整数: "); try { int number = scanner.nextInt(); System.out.println("你输入的整数是: " + number); } catch (java.util.InputMismatchException e) { System.out.println("输入错误!你输入的不是有效的整数。"); } finally { scanner.close(); } -
next()vsnextLine():这是最常见的混淆点。next():读取到空白符为止。nextLine():读取到换行符为止。next()不会消耗掉它之后的换行符,而nextLine()会。
Scanner 是 Java 中一个非常基础且强大的工具,用于处理输入,掌握它的核心用法是学习 Java 编程的重要一步,记住以下几个关键点:
- 导入:
import java.util.Scanner; - 创建:
Scanner scanner = new Scanner(System.in);(或从文件) - 读取:根据需要选择
next(),nextLine(),nextInt()等方法。 - 判断:使用
hasNext()或hasNextLine()控制循环。 - 关闭:使用
try-with-resources或在finally块中调用close()。 - 异常处理:使用
try-catch处理InputMismatchException。
