杰瑞科技汇

Java文件Scanner如何读取与处理?

Scanner 是 Java java.util 包中的一个类,它是一个简单的文本扫描器,可以使用正则表达式解析基本类型和字符串。Scanner 的主要功能是从输入源(如控制台、文件、字符串等)中读取数据。

Java文件Scanner如何读取与处理?-图1
(图片来源网络,侵删)

Scanner 的基本用法

1 导入 Scanner

在使用 Scanner 之前,必须先导入它:

import java.util.Scanner;

2 创建 Scanner 对象

Scanner 需要一个“输入源”来创建对象,最常见的是从标准输入流(键盘)读取:

// 创建一个 Scanner 对象,用于从 System.in(标准输入流,即键盘)读取数据
Scanner scanner = new Scanner(System.in);

3 使用 nextXxx() 方法读取数据

Scanner 提供了一系列 nextXxx() 方法来读取不同类型的数据,这些方法会跳过输入中的空白符(空格、Tab、换行等),直到找到下一个非空白符。

方法 描述 示例
next() 读取下一个单词(以空白符为分隔符)。 String name = scanner.next();
nextLine() 读取一整行(以换行符 \n 为结束符)。 String line = scanner.nextLine();
nextInt() 读取一个 int 类型的整数。 int age = scanner.nextInt();
nextDouble() 读取一个 double 类型的浮点数。 double price = scanner.nextDouble();
nextBoolean() 读取一个 boolean 类型的值。 boolean flag = scanner.nextBoolean();
nextLong() 读取一个 long 类型的整数。 long id = scanner.nextLong();
nextByte() 读取一个 byte 类型的整数。 byte b = scanner.nextByte();
nextShort() 读取一个 short 类型的整数。 short s = scanner.nextShort();
nextFloat() 读取一个 float 类型的浮点数。 float f = scanner.nextFloat();

4 关闭 Scanner

为了释放系统资源,使用完 Scanner 后应该关闭它。Scanner 关闭后,它所关联的输入流也会被关闭。

Java文件Scanner如何读取与处理?-图2
(图片来源网络,侵删)
scanner.close();

完整示例:从键盘读取输入

这是一个最经典的示例,演示了如何从键盘读取用户名和年龄。

import java.util.Scanner;
public class ScannerExample {
    public static void main(String[] args) {
        // 1. 创建 Scanner 对象
        Scanner scanner = new Scanner(System.in);
        // 2. 提示用户输入
        System.out.print("请输入您的姓名: ");
        // 3. 读取一个单词(遇到空格会停止)
        String name = scanner.next();
        System.out.print("请输入您的年龄: ");
        int age = scanner.nextInt();
        // 4. 输出结果
        System.out.println("您好, " + name + "!");
        System.out.println("您今年 " + age + " 岁。");
        // 5. 关闭 Scanner
        scanner.close();
    }
}

运行示例:

请输入您的姓名: 张三 李四
请输入您的年龄: 25
您好, 张三!
您今年 25 岁。

注意: next() 只读取了 "张三","李四" 留在了输入缓冲区中,这可能会导致后续的输入读取问题。


next()nextLine() 的区别(常见陷阱)

这是 Scanner 使用中最容易出错的地方。

Java文件Scanner如何读取与处理?-图3
(图片来源网络,侵删)
  • next(): 读取到空白符(空格、Tab、回车)就停止。
  • nextLine(): 读取到换行符(回车)才停止。

问题示例:

import java.util.Scanner;
public class ScannerTrap {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入您的姓名: ");
        String name = scanner.next(); // 用户输入 "张三" 并按回车
        System.out.print("请输入您的地址: ");
        String address = scanner.nextLine(); // 这里会直接跳过,读取到上一个回车
        System.out.println("姓名: " + name);
        System.out.println("地址: " + address); // 输出为空
        scanner.close();
    }
}

为什么会这样?

  1. 当你输入 张三 并按下回车时,scanner.next() 读取了 "张三"。
  2. 回车符 \n 还留在输入缓冲区中
  3. 当程序执行到 scanner.nextLine() 时,它发现缓冲区的第一个字符就是换行符 \n,于是它认为这是一行空行,并立即读取完毕,address 的值就是空字符串。

如何解决?

next() 后面加一个 nextLine() 来消耗掉多余的换行符

System.out.print("请输入您的姓名: ");
String name = scanner.next(); // 读取 "张三"
scanner.nextLine(); // 消耗掉输入缓冲区中的 \n
System.out.print("请输入您的地址: ");
String address = scanner.nextLine(); // 正常读取 "北京市朝阳区"

统一使用 nextLine(),然后手动分割

如果不确定输入内容是否包含空格,统一使用 nextLine() 是更健壮的做法,然后用 Stringsplit() 方法或自己处理逻辑来分割数据。

System.out.print("请输入您的姓名和年龄(用空格隔开): ");
String inputLine = scanner.nextLine(); // 读取一整行,"张三 25"
String[] parts = inputLine.split(" "); // 按空格分割
String name = parts[0];
int age = Integer.parseInt(parts[1]);
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);

从文件读取数据

Scanner 不仅可以读取键盘输入,还可以读取文件,只需要在创建 Scanner 对象时传入一个 File 对象或 FileReader 对象即可。

步骤:

  1. 导入 java.io.File, java.io.FileNotFoundExceptionjava.util.Scanner
  2. 创建 File 对象,指定文件路径。
  3. File 对象创建 Scanner
  4. 使用 hasNextXxx() 方法循环判断是否还有下一种类型的输入。
  5. 读取数据并处理。
  6. 关闭 Scanner

示例:

假设有一个名为 data.txt 的文件,内容如下:

Hello World
10
3.14
true
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerFileExample {
    public static void main(String[] args) {
        try {
            // 1. 创建 File 对象
            File file = new File("data.txt");
            // 2. 创建 Scanner 对象,关联文件
            Scanner fileScanner = new Scanner(file);
            // 3. 循环读取文件内容
            while (fileScanner.hasNext()) {
                if (fileScanner.hasNextLine()) {
                    System.out.println("读取到一行: " + fileScanner.nextLine());
                }
                if (fileScanner.hasNextInt()) {
                    System.out.println("读取到一个整数: " + fileScanner.nextInt());
                }
                if (fileScanner.hasNextDouble()) {
                    System.out.println("读取到一个浮点数: " + fileScanner.nextDouble());
                }
                if (fileScanner.hasNextBoolean()) {
                    System.out.println("读取到一个布尔值: " + fileScanner.nextBoolean());
                }
            }
            // 4. 关闭 Scanner
            fileScanner.close();
        } catch (FileNotFoundException e) {
            System.err.println("错误:找不到文件 " + e.getMessage());
            e.printStackTrace();
        }
    }
}

输出结果:

读取到一行: Hello World
读取到一个整数: 10
读取到一个浮点数: 3.14
读取到一个布尔值: true

常用方法总结

方法 描述
hasNext() 判断输入源中是否还有下一个单词。
hasNextLine() 判断输入源中是否还有下一行。
hasNextInt(), hasNextDouble() 判断输入源中下一个标记是否可以转换为指定的类型。
next(), nextLine() 读取并返回下一个标记。
useDelimiter(Pattern pattern) 设置此扫描器的分隔模式。scanner.useDelimiter(","); 可以按逗号分割。
close() 关闭此扫描器。

  • Scanner 是 Java 中进行文本输入的利器,简单易用。
  • 核心是创建对象、读取数据、关闭对象。
  • next()nextLine() 的区别是最大的坑,务必理解清楚。
  • Scanner 不仅可以用于控制台输入,也可以用于文件读取,功能非常灵活。
分享:
扫描分享到社交APP
上一篇
下一篇