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,你就能轻松地编写交互式命令行程序,让程序"活"起来!

相关推荐
swipe44 分钟前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
源码宝2 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
金銀銅鐵2 小时前
[Java] 如何理解 class 文件中方法的 descriptor?
java·后端
村口张大爷2 小时前
05 — 分层架构与依赖倒置
后端·架构·系统架构
Jasonakeke3 小时前
SpringBoot自动配置原理揭秘
java·spring boot·后端
IT_陈寒4 小时前
Vite热更新失灵?你可能漏了这个配置
前端·人工智能·后端
uzong5 小时前
面试官:如何做好架构设计
后端·架构
Cosolar5 小时前
QwenPaw Agent 实现原理深度剖析
后端·面试·架构
Sincerelyplz5 小时前
【AI会议纪要实践】mapReduce、RAG 与结构化输出
java·后端·agent
zavoryn5 小时前
后端接入 AI Agent:Tool Calling 网关、幂等与审计日志实战
后端·架构