Java 中的 Scanner
类是处理输入数据的一个强大工具,它位于 java.util
包中,能让你轻松地从键盘、文件、字符串等多种来源读取数据,并解析成各种基本数据类型。
下面这个表格汇总了 Scanner
类的核心信息,帮你快速把握全貌。
特性分类 | 核心内容 | 关键点/示例 |
核心用途 | 解析基本类型和字符串的简单文本扫描器。 | 将输入流分解为标记(tokens),支持正则表达式匹配。 |
主要输入源 | 标准输入(键盘)、文件、字符串。 |
|
关键读取方法 |
|
|
重要判断方法 |
| 用于在读取前进行输入验证,避免程序因输入类型不匹配而崩溃。 |
使用流程 | 1. 导包 |
|
🔍 理解 next() 与 nextLine() 的区别
这是使用 Scanner
时最需要仔细区分的一点,理解不当容易导致意外的结果。
next()
:读取输入中的“下一个单词”。它会忽略有效字符之前的空白,在遇到空格、制表符或换行符等分隔符时停止读取,并且不会包含这个分隔符。例如,输入Hello World
,sc.next()
只会得到"Hello"
。nextLine()
:读取从当前指针位置到行尾的所有内容(直到遇到换行符\n
),并返回这个字符串(会丢弃行尾的换行符)。它能获取包含空格的完整一行文本。
混合使用的陷阱与解决
当你混合使用 nextInt()
, nextDouble()
, next()
等方法与 nextLine()
时,可能会发现 nextLine()
好像被跳过了。这是因为 nextInt()
等方法只读取数字本身,而将其后输入时按下的回车键(即换行符 \n
)留在了输入缓冲区中。紧随其后的 nextLine()
一读取就立刻遇到了这个 \n
,于是它返回一个空字符串。
解决方案:在连续使用不同方法时,如果中间需要读取完整行,可以在调用 nextLine()
前额外添加一个 nextLine()
调用,以“消耗”掉残留的换行符。
Scanner sc = new Scanner(System.in);
System.out.print("请输入年龄:");
int age = sc.nextInt(); // 输入25后按回车
sc.nextLine(); // 消耗掉残留的换行符
System.out.print("请输入您的完整地址:");
String address = sc.nextLine(); // 现在可以正常读取了
System.out.println("年龄:" + age + ", 地址:" + address);
✅ 输入验证与健壮性编程
直接调用 nextInt()
等方法时,如果用户输入了不匹配的数据(例如输入字母时要求读整数),程序会抛出 InputMismatchException
异常并终止。为了让程序更健壮,推荐在使用读取方法前,先使用对应的 hasNextXxx()
方法进行判断。
Scanner sc = new Scanner(System.in);
int number = 0;
boolean isValid = false;
System.out.print("请输入一个整数:");
while (!isValid) {
if (sc.hasNextInt()) { // 判断输入的下一个标记是否是整数
number = sc.nextInt(); // 是,则安全读取
isValid = true;
} else {
System.out.println("输入错误,请重新输入一个整数:");
sc.next(); // 非常重要:将错误的非整数输入“消耗”掉,否则会陷入死循环
}
}
System.out.println("您输入的整数是:" + number);
sc.close();
📂 从不同源读取数据
Scanner
的强大之处在于它能从多种源读取数据。
- 从字符串读取:
String input = "Hello 123 World";
Scanner strScanner = new Scanner(input);
while (strScanner.hasNext()) {
System.out.println(strScanner.next()); // 依次输出 Hello, 123, World
}
strScanner.close();
- 从文件读取:需要处理
FileNotFoundException
异常。
import java.io.File;
import java.io.FileNotFoundException;
try {
File file = new File("example.txt");
Scanner fileScanner = new Scanner(file);
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
System.out.println(line);
}
fileScanner.close();
} catch (FileNotFoundException e) {
System.out.println("文件未找到!");
}
💡 最佳实践与注意事项
- 及时关闭资源:使用完
Scanner
后,尤其是读取文件的Scanner
,应调用close()
方法关闭它,以释放底层资源。 - 使用 try-with-resources:这是更现代、更安全的做法,能确保
Scanner
被自动关闭,避免资源泄漏。
// 推荐这种方式
try (Scanner sc = new Scanner(System.in)) {
System.out.print("请输入:");
String input = sc.nextLine();
System.out.println("您输入的是:" + input);
} // 无需显式调用 sc.close(),编译器会自动生成
- 设置分隔符:默认分隔符是空格,你可以使用
useDelimiter()
方法自定义分隔模式(支持正则表达式)。
String data = "Alice,25,Developer;Bob,30,Designer";
Scanner sc = new Scanner(data).useDelimiter("[,;]"); // 使用逗号或分号分隔
while (sc.hasNext()) {
System.out.println(sc.next().trim()); // 依次输出每个字段
}
sc.close();
希望这份详细的介绍能帮助你全面掌握 Java 中的 Scanner
类!如果你对某个特定用法有进一步的疑问,我们可以继续探讨。