
scanner.reset() 方法的主要目的是将 scanner 实例的显式状态信息恢复到其初始默认值。根据 oracle 官方文档的描述,当一个 scanner 被重置时,它会丢弃所有可能通过调用 usedelimiter(java.util.regex.pattern)、uselocale(java.util.locale) 或 useradix(int) 方法而改变的显式状态信息。
具体来说,reset() 方法会执行以下操作:
需要注意的是,reset() 方法不会重置 Scanner 内部的缓冲区或底层输入流的读取位置。它只影响 Scanner 如何解释和解析后续输入。
在文章开头提供的示例代码中,用户发现即使移除 s.reset(),程序也能正常运行。这正是因为在该示例代码中,Scanner 实例的 useDelimiter()、useLocale() 或 useRadix() 方法都没有被调用。换句话说,Scanner 的显式状态一直保持在默认值。在这种情况下,调用 reset() 实际上并没有任何状态可以“重置”,因此它不会对程序的行为产生任何可见影响。
例如,原始代码片段如下:
立即学习“Java免费学习笔记(深入)”;
package com.company;
import java.io.IOException;
import java.util.Scanner;
public class Favorite_Number {
public static void main(String[] args) throws IOException {
int X,sum = 0,rem = 0,t;
Scanner s = new Scanner(System.in);
t = s.nextInt();
while(t!=0) {
s.reset(); // <-- 在这里移除它,程序仍然正常工作
X = s.nextInt();
while (X > 0) {
rem = X % 10;
if (rem == 5) {
sum++;
}
X = X / 10;
}
System.out.println(sum);
sum = 0;
t--;
}
}
}由于 Scanner s 从未调用过 useDelimiter() 等方法来改变其解析状态,s.reset() 在这里是冗余的。
为了更好地理解 reset() 的作用,我们来看几个实际的例子。
默认情况下,Scanner 使用空白字符作为分隔符。我们可以通过 useDelimiter() 改变它,然后用 reset() 恢复。
import java.util.Scanner;
public class ScannerDelimiterResetExample {
public static void main(String[] args) {
String input = "Hello,World!Java-Programming";
Scanner scanner = new Scanner(input);
System.out.println("--- 默认分隔符(空白字符) ---");
// 默认分隔符是空白字符,这里没有空白,所以整个字符串被视为一个token
System.out.println("Next token: " + scanner.next()); // 输出: Hello,World!Java-Programming
scanner.close(); // 关闭当前scanner
scanner = new Scanner(input); // 重新创建一个Scanner
System.out.println("
--- 使用逗号、感叹号或连字符作为分隔符 ---");
scanner.useDelimiter("[,!\-]+"); // 设置分隔符为逗号、感叹号或连字符
while (scanner.hasNext()) {
System.out.println("Next token: " + scanner.next());
}
// 输出:
// Next token: Hello
// Next token: World
// Next token: Java
// Next token: Programming
scanner.close(); // 关闭当前scanner
scanner = new Scanner(input); // 重新创建一个Scanner
System.out.println("
--- 先设置分隔符,再使用 reset() 恢复默认 ---");
scanner.useDelimiter("[,!\-]+"); // 设置分隔符
System.out.println("使用自定义分隔符获取第一个token: " + scanner.next()); // 输出: Hello
scanner.reset(); // 重置Scanner状态,分隔符恢复为默认的空白字符
System.out.println("重置后,使用默认分隔符获取下一个token: " + scanner.next()); // 输出: ,World!Java-Programming
// 因为重置后分隔符变回空白字符,而剩下的字符串中没有空白字符,
// 所以整个剩余部分被视为一个token。
scanner.close();
}
}在这个例子中,可以看到 scanner.reset() 成功地将分隔符从自定义的 [,!\-]+ 恢复到了默认的空白字符,从而改变了后续 next() 方法的解析行为。
Scanner 使用区域设置来解析数字和日期。例如,在某些区域设置中,小数分隔符是逗号而不是点。
import java.util.Locale;
import java.util.Scanner;
public class ScannerLocaleResetExample {
public static void main(String[] args) {
String input = "123.45 67,89";
Scanner scanner = new Scanner(input);
System.out.println("--- 默认区域设置(例如,en_US) ---");
// 假设默认区域设置使用 '.' 作为小数分隔符
System.out.println("Next double (default locale): " + scanner.nextDouble()); // 输出: 123.45
scanner.close(); // 关闭当前scanner
scanner = new Scanner(input); // 重新创建一个Scanner
System.out.println("
--- 使用法国区域设置 (fr_FR) ---");
scanner.useLocale(Locale.FRENCH); // 法国区域设置使用 ',' 作为小数分隔符
System.out.println("Next double (French locale): " + scanner.nextDouble()); // 输出: 67.89
// 注意:这里由于input是"123.45 67,89",
// 默认Locale下,123.45是一个double,67,89则会解析失败或被视为两个token。
// 而在French Locale下,123.45会被解析为整数123,而67,89会被解析为double 67.89。
// 为了演示reset,我们简化一下输入。
scanner.close(); // 关闭当前scanner
String input2 = "123,45 67.89"; // 调整输入,以更好地演示
scanner = new Scanner(input2);
System.out.println("
--- 先设置区域设置,再使用 reset() 恢复默认 ---");
scanner.useLocale(Locale.FRENCH); // 设置为法国区域设置
System.out.println("使用法国区域设置获取第一个double: " + scanner.nextDouble()); // 输出: 123.45
scanner.reset(); // 重置Scanner状态,区域设置恢复为默认
// 假设默认区域设置为en_US,此时 '.' 是小数分隔符
System.out.println("重置后,使用默认区域设置获取下一个double: " + scanner.nextDouble()); // 输出: 67.89
scanner.close();
}
}这个例子展示了 reset() 如何将 Scanner 的区域设置从 Locale.FRENCH 恢复到系统默认区域设置,从而影响了 nextDouble() 方法对数字字符串的解析方式。
Scanner.reset() 方法是一个用于管理 java.util.Scanner 实例解析行为的重要工具。它允许开发者在修改了 Scanner 的分隔符、区域设置或基数后,方便地将其恢复到默认状态。在没有显式修改这些解析状态的情况下,调用 reset() 是冗余的,不会产生任何效果。理解其作用和适用场景,有助于编写更健壮、可预测的 Scanner 代码。
以上就是Java Scanner.reset() 方法详解与应用场景的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号