Java里怎么用Scanner实现控制台输入?新手入门详解

来源:AI教程网作者:相泽南头衔:网络博主
导读:本期聚焦于小伙伴创作的《Java里怎么用Scanner实现控制台输入?新手入门详解》,敬请观看详情。想从命令行读取用户输入却总报异常?Scanner是Java标准库里处理控制台输入的基础工具,它把System.in字节流包装成可解析的文本源。创建时要传入InputStream,常用nextLine读整行、nextInt读整数,但混合调用容易吞掉换行符。关闭Scanner会顺带关掉System.in,因此程序里通常只建一个实例。理解分隔符机制和异常处理,才能写出稳定的交互式程序。

在Java程序中,通过控制台与用户交互是最基础的能力之一。java.util.Scanner类封装了词法分析逻辑,可以把原始的字节输入流转换成具有类型的令牌,例如整数、浮点数或者一行文本。理解它的构造方式、读取方法以及常见的陷阱,能帮助开发者快速搭建命令行工具。

Java里怎么用Scanner实现控制台输入?新手入门详解

一、Scanner的基本创建与关闭

Scanner最简单的用法就是包装标准输入流System.in。System.in是一个InputStream,直接读取字节非常麻烦,而Scanner提供了丰富的next方法。在main方法中,我们通常写成下面这样:

import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的名字:");
        String name = sc.nextLine();
        System.out.println("你好," + name);
        sc.close();
    }
}

上面的代码创建了一个绑定到控制台的Scanner,调用nextLine读取一整行文本。需要注意的是,Scanner的close方法会关闭底层流,也就是System.in。如果在程序中途关闭了Scanner,后续再创建新的Scanner(System.in)就会失败,因为System.in已经被关掉。因此在单一程序里,建议只创建一个Scanner,并且在程序退出前才关闭,或者直接不关闭交由JVM回收。

另外,Scanner也可以读取文件、字符串等其他数据源。例如new Scanner("hello world")可以从字符串解析,new Scanner(new File("a.txt"))可以从文件读取。这种统一性让它在教学和简单工具中非常受欢迎。但在高并发或者大数据量场景下,它的性能不如BufferedReader,这一点我们后面会提到。

二、常用读取方法对比

Scanner提供了一系列next开头的方法,用来读取不同类型的数据。最常用的是next()、nextLine()、nextInt()、nextDouble()。它们行为差异很大,混淆使用是新手最容易犯的错误。

方法读取内容是否消耗换行符遇到空格处理
next()下一个单词以空白分隔,不读空格
nextLine()一整行读到换行符为止
nextInt()整数只解析数字
nextDouble()浮点数只解析数字

可以看到,nextInt这类方法只读取数字部分,不会消耗数字后面的换行符。如果紧接着调用nextLine,它会立刻读到一个空字符串,因为上一行的换行符还在缓冲区。这个问题在下面代码中非常典型:

Scanner sc = new Scanner(System.in);
System.out.print("输入年龄:");
int age = sc.nextInt();   // 输入 20 并回车
System.out.print("输入姓名:");
String name = sc.nextLine(); // 直接读到空行,跳过输入
System.out.println(age + " " + name);

解决方式有两种。一种是在nextInt之后额外调用一次nextLine吃掉换行符;另一种是统一使用nextLine读取,然后自己用Integer.parseInt转换。后一种方式逻辑更清晰,也避免了多种方法混用带来的隐患。在写交互程序时,推荐始终用nextLine接收,再做类型转换和校验。

三、分隔符与异常处理

Scanner默认使用空白字符作为分隔符,但我们可以通过useDelimiter方法自定义。例如读取逗号分隔的数据:

Scanner sc = new Scanner("1,2,3");
sc.useDelimiter(",");
while (sc.hasNextInt()) {
    System.out.println(sc.nextInt());
}
sc.close();

当用户输入不符合预期类型时,比如让nextInt去解析字母,会抛出InputMismatchException。因此健壮的程序应该用hasNextInt先做判断,或者用try-catch包裹解析逻辑。下面展示一个安全的整数读取函数:

public static int readInt(Scanner sc, String prompt) {
    while (true) {
        System.out.print(prompt);
        if (sc.hasNextInt()) {
            return sc.nextInt();
        } else {
            sc.next(); // 丢弃错误输入
            System.out.println("输入不是整数,请重新输入");
        }
    }
}

这段代码不断循环,直到用户正确输入整数为止。它先通过hasNextInt确认类型,再读取,避免异常中断程序。对于命令行工具来说,这种防御式输入处理能显著提升用户体验。同时要注意,sc.next()在这里用于消耗掉错误的令牌,否则错误内容一直留在缓冲区会导致死循环。

四、Scanner与BufferedReader的选择

虽然Scanner方便,但它是基于正则做解析的,在大量文本读取时效率偏低。如果只需要按行读取并且自己处理拆分,java.io.BufferedReader性能更好。对比示例如下:

// BufferedReader方式
import java.io.BufferedReader;
import java.io.InputStreamReader;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
int num = Integer.parseInt(line.trim());

BufferedReader没有nextInt这类方法,所有内容都以字符串返回,开发者要自行转换。但它减少了正则匹配开销,适合处理大文件或高频输入。对于学习阶段和简单交互,Scanner凭借易用性依然是首选。实际项目中可以根据输入规模权衡,小规模用Scanner,大规模用BufferedReader。

总的来说,掌握Scanner的创建、读取方法差异、换行符陷阱以及异常防护,就能应对绝大多数Java控制台输入场景。在写代码时保持单一实例、统一读取策略,可让程序更稳健。

JavaScanner控制台输入修改时间:2026-07-31 14:54:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。