0
点赞
收藏
分享

微信扫一扫

Java中的Scanner类

Java 中的 Scanner类是处理输入数据的一个强大工具,它位于 java.util包中,能让你轻松地从键盘、文件、字符串等多种来源读取数据,并解析成各种基本数据类型。

下面这个表格汇总了 Scanner类的核心信息,帮你快速把握全貌。

特性分类

核心内容

关键点/示例

核心用途

解析基本类型和字符串的简单文本扫描器。

将输入流分解为标记(tokens),支持正则表达式匹配。

主要输入源

标准输入(键盘)、文件、字符串。

Scanner sc = new Scanner(System.in);(从键盘输入)。

关键读取方法

next():读取下一个单词(以空格分隔)。
nextLine():读取一整行(直到换行符)。
nextInt(), nextDouble()等:读取特定类型数据。

String str = sc.next();String line = sc.nextLine();int num = sc.nextInt();

重要判断方法

hasNext():是否还有下一个标记。
hasNextInt(), hasNextDouble()等:判断下一个标记是否为指定类型。

用于在读取前进行输入验证,避免程序因输入类型不匹配而崩溃。

使用流程

1. 导包 import java.util.Scanner;2. 创建Scanner对象
3. 提示并读取数据
4. 关闭Scanner。

Scanner sc = new Scanner(System.in);int i = sc.nextInt();sc.close();

🔍 理解 next() 与 nextLine() 的区别

这是使用 Scanner时最需要仔细区分的一点,理解不当容易导致意外的结果。

  • next():读取输入中的“下一个单词”。它会忽略有效字符之前的空白,在遇到空格、制表符或换行符等分隔符时停止读取,并且不会包含这个分隔符。例如,输入 Hello Worldsc.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("文件未找到!");
}

💡 最佳实践与注意事项

  1. 及时关闭资源:使用完 Scanner后,尤其是读取文件的 Scanner,应调用 close()方法关闭它,以释放底层资源。
  2. 使用 try-with-resources:这是更现代、更安全的做法,能确保 Scanner被自动关闭,避免资源泄漏。

// 推荐这种方式
try (Scanner sc = new Scanner(System.in)) {
    System.out.print("请输入:");
    String input = sc.nextLine();
    System.out.println("您输入的是:" + input);
} // 无需显式调用 sc.close(),编译器会自动生成

  1. 设置分隔符:默认分隔符是空格,你可以使用 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类!如果你对某个特定用法有进一步的疑问,我们可以继续探讨。

举报

相关推荐

0 条评论