跳转至

Java java.util.Scanner 全面解析

简介

在 Java 编程中,我们常常需要从用户或文件中读取输入数据。java.util.Scanner 类就是 Java 标准库提供的一个强大工具,用于解析基本类型和字符串,它可以方便地从多种输入源(如控制台、文件等)读取数据。本文将深入探讨 java.util.Scanner 的基础概念、使用方法、常见实践以及最佳实践,帮助读者更好地掌握这个实用的类。

目录

  1. 基础概念
  2. 使用方法
    • 初始化 Scanner 对象
    • 读取不同类型的数据
  3. 常见实践
    • 从控制台读取用户输入
    • 从文件读取数据
  4. 最佳实践
    • 关闭 Scanner 对象
    • 避免 nextLine() 与其他 nextXXX() 方法混用的问题
  5. 小结
  6. 参考资料

基础概念

java.util.Scanner 是 Java 中的一个类,它位于 java.util 包下。该类的主要功能是解析基本类型和字符串,它可以使用正则表达式来解析原始类型和字符串。Scanner 类提供了多种方法来读取不同类型的数据,如 nextInt() 用于读取整数,nextDouble() 用于读取双精度浮点数,nextLine() 用于读取一行文本等。

使用方法

初始化 Scanner 对象

要使用 Scanner 类,首先需要创建一个 Scanner 对象。可以根据不同的输入源来初始化 Scanner 对象。以下是几种常见的初始化方式:

从标准输入(控制台)读取数据

import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        // 创建一个 Scanner 对象,从标准输入读取数据
        Scanner scanner = new Scanner(System.in);
        // 使用完后关闭 Scanner 对象
        scanner.close();
    }
}

从文件读取数据

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ScannerFileExample {
    public static void main(String[] args) {
        try {
            // 创建一个 File 对象
            File file = new File("example.txt");
            // 创建一个 Scanner 对象,从文件中读取数据
            Scanner scanner = new Scanner(file);
            // 使用完后关闭 Scanner 对象
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

读取不同类型的数据

Scanner 类提供了多种方法来读取不同类型的数据。以下是一些常见的示例:

import java.util.Scanner;

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

        // 读取整数
        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt();
        System.out.println("你输入的整数是: " + num);

        // 读取双精度浮点数
        System.out.print("请输入一个双精度浮点数: ");
        double d = scanner.nextDouble();
        System.out.println("你输入的双精度浮点数是: " + d);

        // 读取字符串
        System.out.print("请输入一个字符串: ");
        String str = scanner.next();
        System.out.println("你输入的字符串是: " + str);

        // 读取一行文本
        scanner.nextLine(); // 消耗掉上一次输入的换行符
        System.out.print("请输入一行文本: ");
        String line = scanner.nextLine();
        System.out.println("你输入的一行文本是: " + line);

        scanner.close();
    }
}

常见实践

从控制台读取用户输入

在 Java 程序中,经常需要从控制台读取用户输入的数据。以下是一个简单的示例,计算用户输入的两个整数的和:

import java.util.Scanner;

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

        System.out.print("请输入第一个整数: ");
        int num1 = scanner.nextInt();

        System.out.print("请输入第二个整数: ");
        int num2 = scanner.nextInt();

        int sum = num1 + num2;
        System.out.println("两个整数的和是: " + sum);

        scanner.close();
    }
}

从文件读取数据

可以使用 Scanner 类从文件中读取数据。以下是一个简单的示例,读取文件中的每一行并打印出来:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadFromFile {
    public static void main(String[] args) {
        try {
            File file = new File("example.txt");
            Scanner scanner = new Scanner(file);

            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }

            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

最佳实践

关闭 Scanner 对象

在使用完 Scanner 对象后,应该调用 close() 方法关闭它,以释放系统资源。如果 Scanner 对象是从 System.in 初始化的,关闭它会导致标准输入流被关闭,后续无法再从控制台读取数据。因此,在实际开发中,要谨慎处理从 System.in 初始化的 Scanner 对象。

避免 nextLine() 与其他 nextXXX() 方法混用的问题

nextLine() 方法会读取一行文本,包括换行符。而其他 nextXXX() 方法(如 nextInt()nextDouble() 等)在读取完数据后,不会消耗换行符。因此,在使用 nextXXX() 方法后,如果需要使用 nextLine() 方法,应该先调用 nextLine() 方法消耗掉换行符。

import java.util.Scanner;

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

        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt();
        scanner.nextLine(); // 消耗掉换行符

        System.out.print("请输入一行文本: ");
        String line = scanner.nextLine();
        System.out.println("你输入的整数是: " + num);
        System.out.println("你输入的一行文本是: " + line);

        scanner.close();
    }
}

小结

java.util.Scanner 是 Java 中一个非常实用的类,它可以方便地从多种输入源读取不同类型的数据。在使用 Scanner 类时,需要注意初始化对象的输入源,使用完后及时关闭对象以释放资源,避免 nextLine() 与其他 nextXXX() 方法混用的问题。通过掌握 Scanner 类的使用方法和最佳实践,可以提高 Java 程序处理输入数据的效率和稳定性。

参考资料

  1. 《Effective Java》(第三版)
  2. 《Java 核心技术》(第十版)