Java 基础补充:零基础学Java | Scanner 类详解

Java 基础补充:Scanner 类详解


1. Scanner 是什么?

Scanner 是 Java 提供的一个用于获取用户输入 的工具类,它位于 java.util 包中。通过 Scanner,我们可以轻松地从键盘读取整数、小数、字符串等不同类型的数据,而无需自己处理复杂的输入流。

为什么需要 Scanner?

在命令行程序中,我们经常需要与用户交互:程序向用户提出问题,用户通过键盘输入答案,程序再根据输入做出响应。如果没有 Scanner,我们需要使用较底层的 System.in 和复杂的字节流处理,非常麻烦。Scanner 封装了这些细节,提供了简洁的 API。


2. 如何使用 Scanner?

2.1 导入 Scanner 类

因为 Scannerjava.util 包中,使用前需要导入:

java 复制代码
import java.util.Scanner;

2.2 创建 Scanner 对象

要读取键盘输入,我们需要创建一个 Scanner 对象,并指定输入源为 System.in(标准输入,即键盘)。

java 复制代码
Scanner scanner = new Scanner(System.in);

System.in 是 Java 提供的标准输入流,默认连接键盘。

2.3 读取不同类型的数据

Scanner 提供了多个方法来读取不同类型的数据:

方法 返回值类型 说明
nextInt() int 读取一个整数
nextDouble() double 读取一个浮点数
nextLine() String 读取一行字符串(包括空格)
next() String 读取一个单词(以空白字符分隔)
nextBoolean() boolean 读取一个布尔值(true/false)
nextByte() byte 读取一个字节
nextShort() short 读取一个短整数
nextLong() long 读取一个长整数
nextFloat() float 读取一个单精度浮点数

这些方法都会阻塞等待用户输入,直到用户输入内容并按回车。

2.4 简单示例

java 复制代码
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.print("请输入你的身高(米):");
        double height = scanner.nextDouble();

        System.out.println("你好," + name + ",你今年 " + age + " 岁,身高 " + height + " 米。");

        scanner.close(); // 关闭扫描器,释放资源
    }
}

运行示例:

复制代码
请输入你的姓名:张三
请输入你的年龄:25
请输入你的身高(米):1.75
你好,张三,你今年 25 岁,身高 1.75 米。

3. 注意事项

3.1 读取完数字后读取字符串的问题

当使用 nextInt()nextDouble() 等读取数字后,输入缓冲区中会残留一个换行符(用户按回车产生的 \n)。如果紧接着使用 nextLine(),它会直接读取这个残留的换行符,导致读取到空字符串。

错误示例

java 复制代码
System.out.print("请输入年龄:");
int age = scanner.nextInt();
System.out.print("请输入姓名:");
String name = scanner.nextLine(); // 直接读到空字符串,不会等待用户输入

解决方法 :在数字读取后,先调用一次 nextLine() 消耗掉换行符,或者都使用 nextLine() 读取后再转换。

java 复制代码
System.out.print("请输入年龄:");
int age = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
System.out.print("请输入姓名:");
String name = scanner.nextLine();

或者都用 nextLine() 然后手动转换:

java 复制代码
System.out.print("请输入年龄:");
int age = Integer.parseInt(scanner.nextLine());

3.2 输入类型不匹配的异常

如果用户输入的内容与期望的类型不符(例如要求输入整数却输入了字母),Scanner 会抛出 InputMismatchException。因此在实际开发中,通常需要加入异常处理或验证。

3.3 关闭 Scanner

Scanner 不再使用时,建议调用 close() 方法释放与之关联的资源。注意:关闭 Scanner 的同时也会关闭其输入流(System.in),关闭后就不能再使用 System.in 读取输入了。所以一般在程序最后关闭。


4. Scanner 的其他用法

除了读取键盘输入,Scanner 还可以读取文件、字符串等。例如:

  • 读取字符串Scanner sc = new Scanner("Hello World");
  • 读取文件Scanner sc = new Scanner(new File("data.txt"));

这为我们处理不同来源的数据提供了统一的方式。


5. 总结

  • Scanner 是 Java 提供的一个方便读取输入的类,位于 java.util 包。
  • 通过 new Scanner(System.in) 创建对象来读取键盘输入。
  • 提供了 nextInt()nextLine() 等方法读取不同类型的数据。
  • 注意数字读取后残留换行符的问题,以及输入类型不匹配的异常。
  • 使用完毕后建议关闭 Scanner

掌握 Scanner,你就能轻松地编写交互式命令行程序,让程序"活"起来!

相关推荐
QQ_216962909623 分钟前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理2 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒2 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构3 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构3 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构3 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常4 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端
LinMINGJing0074 小时前
PageHeaderData:Page 的页面头
后端
2601_962069774 小时前
SpringBoot开发——初步了解SpringBoot
java·spring boot·后端
jay神5 小时前
【计算机毕业设计】基于Spring Boot的宠物领养管理系统
java·spring boot·后端·vue·毕业设计·宠物