杰瑞科技汇

Scanner如何正确使用?

Scanner 是什么?

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

Scanner如何正确使用?-图1
(图片来源网络,侵删)
  • 读取用户输入:从键盘(标准输入流 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

    Scanner如何正确使用?-图2
    (图片来源网络,侵删)
    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() 遇到这个换行符,就认为读取了一行空内容,然后执行完毕。

Scanner如何正确使用?-图3
(图片来源网络,侵删)

修正后的代码(解决换行符问题):

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

最佳实践和注意事项

  1. 总是关闭 ScannerScanner 底层会持有一些系统资源(如文件流),如果不关闭,可能会导致资源泄露,使用 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() 会在这里自动被调用
  2. 处理输入异常:当用户输入的数据类型和你期望的不符时(比如你用 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();
    }
  3. next() vs nextLine():这是最常见的混淆点。

    • 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
分享:
扫描分享到社交APP
上一篇
下一篇