java scanner用法(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在Java编程中,与用户或系统的交互是程序设计的核心环节之一。无论是开发简单的命令行工具,还是复杂的图形化界面应用,输入与输出操作都是不可或缺的基础技能。Scanner类作为Java标准库中用于解析输入的强大工具,能够帮助开发者高效地实现数据读取功能。对于编程初学者而言,掌握Scanner的用法不仅能提升代码编写效率,还能为后续学习更复杂的IO操作打下坚实基础。本文将以循序渐进的方式,结合实际案例和形象比喻,深入解析Scanner类的核心功能及常见应用场景。


一、Scanner类的基础概念与工作原理

1.1 什么是Scanner?

Scanner类是Java中用于解析基本类型和字符串输入的工具,它能够将输入流(如控制台输入、文件内容等)转换为程序可处理的数据类型。可以将其想象为一位“翻译官”:当用户输入文字或数字时,Scanner会根据预设的规则,将这些原始文本翻译成Java代码能直接使用的变量值。

1.2 Scanner的核心功能

  • 解析输入:将输入流中的字符串转换为整数、浮点数、布尔值等数据类型。
  • 分隔符处理:自动识别输入中的分隔符(如空格、换行符),并按需提取数据片段。
  • 灵活输入源:支持从控制台、文件或自定义输入流中读取数据。

1.3 使用Scanner的三个步骤

  1. 导入类:通过import java.util.Scanner;引入Scanner类。
  2. 创建实例:指定输入源(如System.in表示控制台输入)。
  3. 读取数据:调用对应的方法(如nextInt()nextLine())获取数据。

二、基础用法:从控制台读取输入

2.1 最简单的Scanner示例

import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner实例
        System.out.print("请输入您的姓名:");
        String name = scanner.nextLine(); // 读取整行输入
        System.out.println("您好," + name + "!");
        scanner.close(); // 关闭Scanner对象
    }
}

代码解析

  • new Scanner(System.in):将输入源绑定到控制台。
  • nextLine()方法会读取用户输入的一整行文本,直到按下回车键为止。
  • scanner.close():关闭资源,避免内存泄漏。

2.2 读取不同数据类型的输入

Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int number = scanner.nextInt(); // 读取整数
System.out.print("请输入一个浮点数:");
double decimal = scanner.nextDouble(); // 读取浮点数
System.out.print("请输入一个布尔值(true/false):");
boolean flag = scanner.nextBoolean(); // 读取布尔值

注意事项

  • 类型匹配:若用户输入与方法类型不符(如用nextInt()输入字母),会抛出InputMismatchException异常。
  • 换行符处理nextInt()等方法会保留换行符,导致后续nextLine()直接读取空行。解决方法是在nextLine()前添加一个空读取操作:
    int number = scanner.nextInt();
    scanner.nextLine(); // 清空换行符
    String comment = scanner.nextLine();
    

三、进阶技巧:处理复杂输入场景

3.1 自定义分隔符解析

默认情况下,Scanner以空格、换行符或制表符作为分隔符。若需自定义分隔符(例如用逗号分隔),可通过useDelimiter()方法实现:

Scanner csvScanner = new Scanner("Alice,30,Boston").useDelimiter(",");
String name = csvScanner.next(); // "Alice"
int age = csvScanner.nextInt(); // 30
String city = csvScanner.next(); // "Boston"

比喻:分隔符如同“标点符号”,Scanner会根据指定的标点将输入内容拆分为独立的数据片段。

3.2 从文件读取数据

通过Scanner读取文件内容时,需先创建文件输入流:

File file = new File("data.txt");
Scanner fileScanner = new Scanner(file);
while (fileScanner.hasNextLine()) {
    String line = fileScanner.nextLine();
    System.out.println(line);
}
fileScanner.close();

异常处理:文件路径错误或权限问题会导致FileNotFoundException,建议使用try-with-resources语句自动关闭资源:

try (Scanner scanner = new Scanner(new File("data.txt"))) {
    // 处理逻辑
} catch (IOException e) {
    e.printStackTrace();
}

3.3 高级过滤与查找

Scanner支持通过正则表达式过滤输入内容:

Scanner regexScanner = new Scanner("123-456-7890");
regexScanner.useDelimiter("\\D+"); // 以非数字字符分隔
while (regexScanner.hasNextInt()) {
    int num = regexScanner.nextInt();
    System.out.print(num + " "); // 输出:123 456 7890
}

四、常见问题与解决方案

4.1 输入不匹配异常(InputMismatchException)

当调用nextInt()但用户输入了字符串时,程序会抛出异常。解决方案是:

  1. 使用try-catch捕获异常
    try {
        int num = scanner.nextInt();
    } catch (InputMismatchException e) {
        System.out.println("请输入有效数字!");
        scanner.next(); // 清空错误输入
    }
    
  2. 改用next()方法获取字符串后转换
    String input = scanner.next();
    int num = Integer.parseInt(input); // 可能抛出NumberFormatException
    

4.2 资源未关闭问题

未调用close()可能导致资源泄漏。最佳实践是使用try-with-resources

try (Scanner scanner = new Scanner(System.in)) {
    // 代码逻辑
} // 自动关闭scanner

4.3 处理多行输入

若需读取多行文本(如用户输入一段描述),可循环调用nextLine()

System.out.println("请输入多行文本(输入EOF结束):");
while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.equalsIgnoreCase("EOF")) break;
    System.out.println("您输入的内容:" + line);
}

五、实战案例:简易计算器程序

import java.util.Scanner;

public class SimpleCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入第一个数字:");
        double num1 = scanner.nextDouble();
        System.out.print("请输入第二个数字:");
        double num2 = scanner.nextDouble();
        System.out.print("请选择运算符 (+, -, *, /):");
        char operator = scanner.next().charAt(0);
        
        double result;
        switch (operator) {
            case '+': result = num1 + num2; break;
            case '-': result = num1 - num2; break;
            case '*': result = num1 * num2; break;
            case '/':
                if (num2 == 0) {
                    System.out.println("除数不能为零!");
                    return;
                }
                result = num1 / num2;
                break;
            default:
                System.out.println("无效的运算符!");
                return;
        }
        System.out.printf("%.2f %c %.2f = %.2f%n", num1, operator, num2, result);
        scanner.close();
    }
}

运行示例

请输入第一个数字:15
请输入第二个数字:3
请选择运算符 (+, -, *, /):/
15.00 / 3.00 = 5.00

结论:掌握Scanner是Java编程的重要基石

通过本文的讲解,读者应已掌握Scanner类的核心功能、常见用法及问题解决策略。从基础的控制台输入到复杂的文件解析,Scanner凭借其灵活的分隔符处理和类型转换能力,成为Java开发者必备的工具之一。建议读者通过以下步骤巩固知识:

  1. 动手实践:尝试修改示例代码,测试不同输入场景。
  2. 阅读文档:查阅Scanner类的官方API文档,探索更多方法(如hasNext()findInLine())。
  3. 解决实际问题:将Scanner应用于自己的项目中,如实现问卷调查程序或数据统计工具。

记住,熟练掌握Scanner不仅能提升代码效率,更能为后续学习Java NIO、网络编程等高级IO技术奠定基础。通过不断练习与探索,您将逐渐成长为能够应对复杂输入输出场景的Java开发者。

最新发布