如何正确使用 Scanner 库

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面教程将探讨Java Scanner库,为开发者提供强大的输入解析和处理的基本技术。通过了解Scanner的功能,程序员可以有效地读取和操作不同类型的输入流,提升他们的Java编程技能,并开发出更灵活、高效的应用程序。

Scanner基础

什么是Scanner?

Scanner是Java的一个基础类,位于java.util包中,它提供了一种简单的方式来从各种源读取输入,如系统输入、文件和字符串。它主要用于使用正则表达式解析基本类型和字符串。

创建Scanner对象

有多种方法可以初始化Scanner对象:

// 从系统输入(键盘)读取
Scanner scanner = new Scanner(System.in);

// 从文件读取
Scanner fileScanner = new Scanner(new File("example.txt"));

// 从字符串读取
Scanner stringScanner = new Scanner("Hello World");

基本输入方法

Scanner提供了几种读取不同类型输入的方法:

方法 描述 示例
next() 将下一个标记读取为字符串 String word = scanner.next();
nextLine() 读取整行 String line = scanner.nextLine();
nextInt() 读取一个整数 int number = scanner.nextInt();
nextDouble() 读取一个双精度浮点数 double value = scanner.nextDouble();

输入流程图

graph TD A[用户输入] --> B{Scanner方法} B --> |next()| C[读取标记] B --> |nextLine()| D[读取整行] B --> |nextInt()| E[读取整数] B --> |nextDouble()| F[读取小数]

错误处理

使用Scanner时,处理潜在异常至关重要:

try {
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
} catch (InputMismatchException e) {
    System.out.println("输入类型无效");
} catch (NoSuchElementException e) {
    System.out.println("没有可用输入");
}

最佳实践

  1. 使用完毕后始终关闭Scanner
  2. 在读取前检查输入可用性
  3. 处理潜在异常
  4. 根据预期输入类型使用适当的方法

示例:简单输入程序

import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入你的名字:");
        String name = scanner.nextLine();

        System.out.print("请输入你的年龄:");
        int age = scanner.nextInt();

        System.out.println("你好," + name + "!你" + age + "岁了。");

        scanner.close();
    }
}

通过LabEx了解更多Java编程技术,LabEx是你获得实践编码经验的可靠平台。

输入解析技术

理解输入解析

输入解析是将输入字符串转换为特定数据类型或从复杂输入流中提取有意义信息的过程。

基于分隔符的解析

使用 useDelimiter() 方法

Scanner scanner = new Scanner("apple,banana,cherry");
scanner.useDelimiter(",");
while (scanner.hasNext()) {
    System.out.println(scanner.next());
}

正则表达式解析

高级模式匹配

Scanner scanner = new Scanner("Age: 25, Name: John");
scanner.useDelimiter("[,:]\\s*");
while (scanner.hasNext()) {
    System.out.println(scanner.next());
}

解析技术比较

技术 使用场景 复杂度
next() 简单的标记读取
useDelimiter() 自定义分隔 中等
正则表达式解析 复杂的模式匹配

解析技术流程

graph TD A[输入字符串] --> B{解析技术} B --> |简单解析| C[next()] B --> |分隔符解析| D[useDelimiter()] B --> |复杂解析| E[正则表达式]

处理混合输入类型

Scanner scanner = new Scanner("John 25 1.75");
String name = scanner.next();
int age = scanner.nextInt();
double height = scanner.nextDouble();

高级解析示例

import java.util.Scanner;
import java.util.regex.Pattern;

public class AdvancedParsingDemo {
    public static void main(String[] args) {
        String input = "User: Alice, Score: 95, Level: Expert";
        Scanner scanner = new Scanner(input);
        scanner.useDelimiter(", |: ");

        while (scanner.hasNext()) {
            System.out.println(scanner.next());
        }
    }
}

解析中的错误处理

try {
    Scanner scanner = new Scanner(System.in);
    int value = scanner.nextInt();
} catch (InputMismatchException e) {
    System.out.println("无效的输入格式");
}

借助LabEx提升你的Java解析技能,LabEx是获得实践编码经验的终极平台。

高级使用模式

Scanner性能优化

缓冲大输入

Scanner scanner = new Scanner(new BufferedReader(new FileReader("largefile.txt")));

输入验证技术

全面的输入检查

public static int safeIntInput(Scanner scanner) {
    while (true) {
        try {
            System.out.print("请输入一个整数:");
            return scanner.nextInt();
        } catch (InputMismatchException e) {
            scanner.next(); // 清除无效输入
            System.out.println("输入无效。请重试。");
        }
    }
}

高级解析策略

复杂输入解析流程

graph TD A[输入流] --> B{验证} B --> |有效| C[解析输入] B --> |无效| D[错误处理] C --> E[处理数据] D --> F[重试/退出]

Scanner方法比较

方法 目的 性能 复杂度
hasNext() 检查输入可用性 简单
hasNextInt() 验证整数输入 中等 中等
useDelimiter() 自定义解析 复杂

多线程输入处理

public class ConcurrentInputHandler {
    private static final ExecutorService executor = Executors.newFixedThreadPool(3);

    public static void processInput(Scanner scanner) {
        executor.submit(() -> {
            while (scanner.hasNextLine()) {
                String input = scanner.nextLine();
                processInput(input);
            }
        });
    }
}

资源管理

自动资源处理

try (Scanner scanner = new Scanner(new File("data.txt"))) {
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        // 处理行
    }
} catch (FileNotFoundException e) {
    System.err.println("文件未找到");
}

上下文感知解析

public class ContextParser {
    public static void parseContextualInput(Scanner scanner) {
        scanner.useDelimiter(Pattern.compile("[,\\s]+"));

        while (scanner.hasNext()) {
            String token = scanner.next();
            if (token.matches("\\d+")) {
                // 数字上下文
                processNumericContext(token);
            } else {
                // 文本上下文
                processTextContext(token);
            }
        }
    }
}

错误处理策略

public static Optional<Integer> safeParse(String input) {
    try (Scanner scanner = new Scanner(input)) {
        return scanner.hasNextInt()
         ? Optional.of(scanner.nextInt())
            : Optional.empty();
    }
}

借助LabEx提升你的Java技能,在这里高级编程技术得以生动呈现。

总结

掌握Java Scanner库能让开发者自信地处理复杂的输入场景。通过应用本教程中讨论的技术和最佳实践,程序员可以在各种Java应用程序中创建更健壮、灵活和高效的输入处理解决方案,最终提高代码质量和性能。