杰瑞科技汇

Java中Scanner是什么?

Scanner 是什么?

Scanner 是 Java java.util 包中的一个工具类,它的主要作用是“获取用户的输入”

Java中Scanner是什么?-图1
(图片来源网络,侵删)

你可以把它想象成一个“扫描仪”或者“读取器”,它可以扫描(读取)不同来源的数据,

  • 你在键盘上输入的内容
  • 一个文本文件(.txt)中的内容
  • 一张图片或一个网络连接中的数据

Scanner 会将读取到的原始数据流(比如一连串的字符),根据你的需要,解析成不同的基本数据类型,

  • 整数 (int)
  • 浮点数 (double, float)
  • 单个字符 (char)
  • 一行字符串 (String)
  • 布尔值 (boolean)

Scanner 的核心功能就是“输入”“解析”


如何使用 Scanner (基本步骤)

使用 Scanner 通常遵循固定的三步曲:

Java中Scanner是什么?-图2
(图片来源网络,侵删)

导入包 (Import)

因为 Scanner 位于 java.util 包中,所以你需要在 Java 文件的顶部使用 import 语句来引入它。

import java.util.Scanner; // 导入 Scanner 类

创建对象 (Create an Instance)

创建一个 Scanner 对象,并告诉它要从哪里读取数据,最常见的用法是从标准输入流(也就是键盘)读取。

// System.in 代表标准输入流,即键盘
Scanner scanner = new Scanner(System.in); 

使用方法获取输入 (Use Methods to Get Input)

调用 Scanner 对象的各种方法来获取你想要的类型的数据。

// 示例:获取一个整数
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt(); // 读取一个整数
System.out.println("你的年龄是: " + age);
// 示例:获取一行字符串
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 读取一行
System.out.println("你好, " + name);

常用方法详解

Scanner 提供了丰富的方法来读取不同类型的数据,下面是一些最常用的:

Java中Scanner是什么?-图3
(图片来源网络,侵删)
方法 描述 示例
next() 读取下一个单词(以空格为分隔符)。 String word = scanner.next();
nextLine() 读取一整行字符串(以回车 \n 为分隔符)。 String line = scanner.nextLine();
nextInt() 读取一个 int 类型的整数。 int num = scanner.nextInt();
nextDouble() 读取一个 double 类型的浮点数。 double price = scanner.nextDouble();
nextBoolean() 读取一个 boolean 类型的值。 boolean flag = scanner.nextBoolean();
hasNext() 判断是否还有下一个单词可以读取。 if (scanner.hasNext()) { ... }
hasNextLine() 判断是否还有下一行字符串可以读取。 while (scanner.hasNextLine()) { ... }

重要注意事项和常见问题

next()nextLine() 的区别 (最容易出错的地方)

这是新手最常遇到的问题,理解它们的区别至关重要。

  • next():

    • 读取到空格、Tab键或回车键时,就认为输入结束。
    • 不会消耗掉输入行末尾的回车符 \n,这个回车符会留在输入缓冲区中。
  • nextLine():

    • 读取到回车键 \n 时,才认为一行输入结束。
    • 消耗掉输入行末尾的回车符 \n

常见问题场景:

如果你先使用 nextInt()next(),再用 nextLine(),可能会发现 nextLine() 被跳过了。

Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt(); // 用户输入 "18" 并按回车
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 这里会直接跳过,读取不到用户输入!
System.out.println("年龄: " + age);
System.out.println("名字: " + name);

为什么会这样? 当用户输入 18 并按回车时,scanner.nextInt() 读取了数字 18,但回车符 \n 仍然留在输入缓冲区中,紧接着,scanner.nextLine() 被调用,它会立刻读取缓冲区中剩下的那个 \n,并认为这是一行空字符串,然后执行结束,所以程序就跳过了等待用户输入名字的步骤。

如何解决?nextInt()next() 之后,调用一个 nextLine() 来“消耗掉”那个多余的回车符。

Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt(); 
scanner.nextLine(); // 【关键】消耗掉nextInt()后留下的回车符
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 现在可以正常等待输入了
System.out.println("年龄: " + age);
System.out.println("名字: " + name);

关闭 Scanner

Scanner 底层会占用系统资源(如文件句柄、I/O流等),当你不再需要使用它时,最好关闭它以释放资源。

scanner.close(); // 关闭 Scanner

注意:一旦 scanner 被关闭,它就不能再被使用了,如果你希望一个 Scanner 对象贯穿整个程序的生命周期,可以在程序结束时再关闭它。


完整示例代码

下面是一个综合示例,演示了如何处理整数、浮点数和字符串,并处理了 next()nextLine() 的潜在问题。

import java.util.Scanner;
public class ScannerExample {
    public static void main(String[] args) {
        // 1. 创建 Scanner 对象,用于读取键盘输入
        Scanner scanner = new Scanner(System.in);
        // --- 获取整数 ---
        System.out.print("请输入你的年龄: ");
        int age = scanner.nextInt();
        // 消耗掉nextInt()后的回车符
        scanner.nextLine(); 
        // --- 获取浮点数 ---
        System.out.print("请输入你的身高 (米): ");
        double height = scanner.nextDouble();
        // 消耗掉nextDouble()后的回车符
        scanner.nextLine();
        // --- 获取字符串 (一整行) ---
        System.out.print("请输入你的家乡: ");
        String hometown = scanner.nextLine();
        // --- 获取字符串 (一个单词) ---
        System.out.print("请输入你的爱好: ");
        String hobby = scanner.next();
        // 2. 打印结果
        System.out.println("\n--- 你的信息 ---");
        System.out.println("年龄: " + age);
        System.out.println("身高: " + height + " 米");
        System.out.println("家乡: " + hometown);
        System.out.println("爱好: " + hobby);
        // 3. 关闭 Scanner
        scanner.close();
    }
}

Scanner 是 Java 中一个简单、强大且易于使用的输入工具,记住以下几点,你就能很好地掌握它:

  1. 用途:用于获取用户输入,并将其解析成各种基本数据类型。
  2. 步骤import -> new Scanner(...) -> 调用方法
  3. 关键:理解 next()nextLine() 的区别,注意处理它们之间的回车符问题。
  4. 好习惯:用完之后 close()Scanner 对象。
分享:
扫描分享到社交APP
上一篇
下一篇