
java.util.Scanner 是一个强大的文本扫描器,可以解析基本类型和字符串。它通过正则表达式来查找输入中的令牌。Scanner.reset() 方法的作用是重置 Scanner 实例的以下显式状态信息:
重要提示: reset() 方法不会重置 Scanner 读取输入流的位置,也不会清空其内部缓冲区。它仅仅是将其解析行为相关的配置恢复到初始状态。
为了更好地理解 reset() 方法,我们首先分析一个它看似“无效”的场景,然后展示它实际发挥作用的场景。
考虑以下代码片段,它与原始问题中提供的代码类似:
立即学习“Java免费学习笔记(深入)”;
import java.io.IOException;
import java.util.Scanner;
public class ScannerResetNoEffect {
public static void main(String[] args) throws IOException {
Scanner s = new Scanner(System.in);
System.out.println("请输入一个整数 (例如: 123):");
int num1 = s.nextInt();
System.out.println("第一次读取的整数: " + num1);
// 在此处调用 s.reset()
// 由于我们没有修改 Scanner 的分隔符、区域或基数,
// 所以调用 reset() 不会改变任何当前的解析行为。
s.reset();
System.out.println("调用 s.reset() 后,请输入另一个整数 (例如: 456):");
int num2 = s.nextInt();
System.out.println("第二次读取的整数: " + num2);
s.close();
}
}运行分析:
当你运行这段代码并输入两个整数时,你会发现无论是否调用 s.reset(),程序的行为都完全相同。这是因为在 s.reset() 被调用之前,Scanner 的分隔符、区域设置和基数都保持在它们的默认状态。reset() 方法的作用是恢复这些状态到默认值,如果它们本身就处于默认值,那么调用 reset() 自然不会产生任何可见的改变。它不是用来重置输入流或“刷新”Scanner 的。
现在,我们来看一个 reset() 真正有意义的场景,即当我们修改了 Scanner 的默认解析行为后,需要将其恢复:
import java.util.Scanner;
import java.util.Locale;
public class ScannerResetEffect {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("--- 演示 reset() 的实际效果 ---");
System.out.println("请输入以分号分隔的数字,然后是另一个数字 (例如: 10;20 30):");
// 1. 修改分隔符为分号
scanner.useDelimiter(";");
System.out.println("当前分隔符: 分号");
// 尝试读取第一个整数
if (scanner.hasNextInt()) {
int val1 = scanner.nextInt();
System.out.println("使用分号分隔符读取: " + val1); // 预期读取 10
} else {
System.out.println("无法使用分号分隔符读取第一个整数。");
}
// 2. 重置 Scanner 的状态
scanner.reset(); // 将分隔符恢复为默认的空白字符
System.out.println("调用 reset() 后,分隔符已恢复为默认的空白字符。");
// 3. 再次尝试读取整数
// 由于分隔符已重置为默认的空白字符,它会跳过之前未被分号处理的空白和分号,
// 并找到下一个有效的整数。
if (scanner.hasNextInt()) {
int val2 = scanner.nextInt();
System.out.println("重置分隔符后读取: " + val2); // 预期读取 20
} else {
System.out.println("重置分隔符后无法读取第二个整数。");
}
// 演示区域设置的重置
System.out.println("\n--- 演示区域设置的重置 ---");
// 假设需要解析一个小数点为逗号的数字 (欧洲格式)
// 例如,输入 "1,23"
// 默认 Locale 下,nextInt() 会失败,nextDouble() 会认为 1,23 是两个数字 1 和 23
// 我们先不修改 Locale,直接尝试读取,会发现问题
System.out.println("请输入一个小数 (例如: 1.23 或 1,23):");
// scanner.useLocale(Locale.US); // 假设默认是US Locale,这里不修改
// 尝试读取一个双精度浮点数
if (scanner.hasNextDouble()) {
double d1 = scanner.nextDouble();
System.out.println("默认 Locale 读取 double: " + d1); // 期望能正确读取
} else {
System.out.println("默认 Locale 无法读取 double。");
// 清除当前行剩余输入,防止影响后续读取
if (scanner.hasNextLine()) {
scanner.nextLine();
}
}
// 改变区域设置为德国 (小数点为逗号)
scanner.useLocale(Locale.GERMANY);
System.out.println("当前 Locale: 德国 (小数点为逗号)");
System.out.println("请再次输入一个小数 (例如: 1,23):");
if (scanner.hasNextDouble()) {
double d2 = scanner.nextDouble();
System.out.println("德国 Locale 读取 double: " + d2); // 预期能正确读取 1.23
} else {
System.out.println("德国 Locale 无法读取 double。");
if (scanner.hasNextLine()) {
scanner.nextLine();
}
}
// 重置区域设置
scanner.reset(); // 恢复为默认 Locale
System.out.println("调用 reset() 后,Locale 已恢复为默认。");
System.out.println("请再次输入一个小数 (例如: 1.23):");
if (scanner.hasNextDouble()) {
double d3 = scanner.nextDouble();
System.out.println("重置 Locale 后读取 double: " + d3); // 预期能正确读取 1.23 (如果默认Locale是US)
} else {
System.out.println("重置 Locale 后无法读取 double。");
}
scanner.close();
}
}运行分析:
当你运行这段代码并按照提示输入时,你会清楚地看到 reset() 如何影响 Scanner 的行为:
尽管在很多简单场景下 reset() 显得多余,但在以下情况下它非常有用:
Scanner.reset() 方法是一个专注于恢复 Scanner 解析行为配置的工具。它能够将分隔符、区域设置和基数恢复到它们的默认值。在需要临时改变 Scanner 的解析规则并在之后恢复标准行为的复杂场景中,reset() 提供了一种优雅且高效的解决方案。理解其作用边界——不影响输入流位置,只影响解析配置——是正确使用它的关键。
以上就是深入理解 Java Scanner 的 reset() 方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号