news 2026/5/12 18:46:56

【JavaSE流程控制】--Scanner类让程序听的懂“用户说话”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【JavaSE流程控制】--Scanner类让程序听的懂“用户说话”

个人主页

目录

    • 前言:
    • Scanner是什么?
      • 导入 Scanner 类
      • Scanner有多个输入源
        • InputStream(字节输入流)
        • File(文件)
        • String(字符串)
        • Readable(可读对象接口)
        • Path(Java NIO 路径)
        • Channel或其他ReadableByteChannel(通过InputStream包装)
    • 标准输出流的控制台输入
      • 导入包和创建一个 Scanner 对象
        • 导包
        • 创建对象
      • 读取数据
        • 字符串
          • next()
          • nextLine()
        • 整数
          • nextInt()
          • nextLong()
          • nextShort()
          • nextByte()
        • 浮点数
          • nextDouble()
          • nextFloat()
      • 判断类型
          • hasNext()
          • hasNextLine()
      • 结束输入
    • 判断用户输入的是小数还是整数
    • 求用户输入的数的总和、平均值
    • 结尾

前言:

学完Java基础,开始学习流程控制。本文将介绍Scanner类是什么?标准输出流该怎么使用以及两种获取字符串的方式和判断输入的数据,最后进行实战。

Scanner是什么?

Scanner是 Java 标准库java.util包下的一个工具类(Java5新特性),专门用于读取外部输入数据(如控制台输入、文件内容、字符串流等),提供了简洁的方法来解析不同类型的输入(字符串、整数、浮点数等),替代了早期BufferedReader等较繁琐的输入方式。

导入 Scanner 类

使用前需导入包(Java 中非java.lang包的类必须显式导入)

importjava.util.Scanner;

Scanner有多个输入源

InputStream(字节输入流)

这是最常见的用法之一,如从标准输入(键盘)读取

Scannerscanner=newScanner(System.in)// 这里的System.in 就是InputStream

也可以传入其他InputStream,比如文件或网络流

InputStreaminput=newFileInputStream("file.txt");Scannerscanner=newScanner(input);
File(文件)

可以直接从文件创建Scanner

Scannerscanner=newScanner(newFile("data.txt"));

Paths.get():

Scannerscanner=newScanner(Paths.get("data.txt"));

⚠️ 需要处理FileNotFoundException

String(字符串)

从一个字符串构造Scanner,用于解析字符串内容

Stringdata="Hello 123 World";Scannerscanner=newScanner(data);

一般用于测试或处理内存中的文本。

Readable(可读对象接口)

可以接收任何实现了Readable接口的对象(比如 BufferedReader、CharBuffer等)

BufferedReaderreader=newBufferedReader(newFileReader("file.txt"));Scannerscanner=newScanner(reader);
Path(Java NIO 路径)

使用 java.nio.file.path来指定文件

Pathpath=Paths.get("example.txt");Scannerscanner=newScanner(path);
Channel或其他ReadableByteChannel(通过InputStream包装)

虽然不能直接传 Channel,但可以通过Channel.newInputStream(channel)转换为 InputStream

ReadableByteChannelchannel=...;InputStreamin=Channels.newInputStream(channel);Scannerscanner=newScanner(in);

标准输出流的控制台输入

这里只讲基础中最常用的控制台输入,及System.in,这里的in就是input

导入包和创建一个 Scanner 对象

导包
importjava.util.Scanner
创建对象
Scannerscanner=newScanner(System.in)

读取数据

字符串
next()
Stringstr=scanner.next();// 输入 Hello World 读取 Hello
nextLine()
Stringstr=scanner.nextLine();// 输入 Hello World 读取 Hello World
  • next():

      1. 一定要读取到有效字符后才可以结束输入
      1. 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉
      1. 只有输入有效字符后才将其后面输入的空白符作为分隔符或者结束符
      1. next() 不能得到带有空格的字符串
  • nextLine():

      1. 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
      1. 可以获得空白
整数
nextInt()
intint1=scanner.nextInt();// 输入 1 读取 1 | 输入 0.1 报错
nextLong()
longlong1=scanner.nextLont();// 输入 111 读取 111
nextShort()
shortshort1=scanner.nextShort();// 输入 111 读取 111
nextByte()
bytebyte1=scanner.nextByte();// 输入 10 读取 10 输入 aaa 报错
浮点数
nextDouble()
doubledouble1=scanner.nextDouble();// 输入 1.1 读取 1.1 输入 1 读取 1.0
nextFloat()
floatfloat1=scanner.nextFloat();// 输入1.1 读取 1.1

判断类型

hasNext()
scanner.hasNext()
hasNextLine()
scanner.hasNextLine()

其他的都一样,把后面的类型改一下就可以

结束输入

凡是属于IO流的类如果不关闭会一只占用资源,要养成好习惯用完就关掉

scanner.close();

判断用户输入的是小数还是整数

importjava.util.Scanner;publicclassDemo01{publicstaticvoidmain(String[]args){// 从键盘接收数据Scannerscanner=newScanner(System.in);inti=0;floatf=0.0f;System.out.println("请输入整数:");// 如果......那么if(scanner.hasNextInt()){i=scanner.nextInt();System.out.println("整数数据:"+i);}else{System.out.println("输入的不是整数数据!");}System.out.println("请输入小数:");if(scanner.hasNextFloat()){f=scanner.nextFloat();System.out.println("小数数据:"+f);}else{System.out.println("输入的不是小数数据!");}scanner.close();}}

求用户输入的数的总和、平均值

importjava.util.Scanner;publicclassDemo05{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 和doublesum=0;// 计算输入了多少个数字intm=0;// 通过循环内判断是否还有输入,并在里面对每一次进行求个和和统计while(scanner.hasNextDouble()){doublex=scanner.nextDouble();m=m+1;// m++sum=sum+x;System.out.println("你输入了第"+m+"个数据,然后当前结果sum="+sum);}System.out.println(m+"个数的和为:"+sum);System.out.println(m+"个数的平均值是:"+(sum/m));scanner.close();}}

结尾

其实 Scanner 更适合简单场景的快速开发,如果你的项目需要处理高并发输入、超大文本,或者对性能有更高要求,不妨试试 BufferedReader 或 Java 8 后的 Stream API 技术没有最优解,只有最适合当前场景的选择

⭐ 如果这对你有帮助,不妨收藏和分享一下!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 18:00:02

想做AI视频创业?先了解Wan2.2-T2V-5B的核心能力

想做AI视频创业?先了解Wan2.2-T2V-5B的核心能力 你有没有想过,一条短视频的制作时间能从几天压缩到8秒?🤯 不是剪辑师手速逆天,而是AI在“凭空造片”。 最近不少创业者私信我:“现在入场AI视频还来得及吗…

作者头像 李华
网站建设 2026/5/10 18:08:16

5步搞定SolidWorks 2024完整安装指南

5步搞定SolidWorks 2024完整安装指南 【免费下载链接】SolidWorks2024安装教程指南 本仓库提供SolidWorks 2024的安装教程指南及安装包资源。SolidWorks是一款广泛应用于机械设计领域的三维CAD软件,具有强大的功能和易学易用的特点。本教程将详细指导您如何安装Soli…

作者头像 李华
网站建设 2026/5/10 17:34:15

UniApp实现刷新当前页面

在UniApp开发过程中,刷新当前页面是高频需求,例如数据提交后同步更新页面展示、用户操作后重新加载内容等。由于UniApp同时适配多端,不同场景下最优的刷新方式存在差异。本文将详细介绍多种实现方案,并分析其适用场景与注意事项。…

作者头像 李华
网站建设 2026/5/10 18:08:00

基于Java+SpringBoot车辆租赁管理系统(源码+lw+部署文档+讲解等)

课题介绍基于 JavaSpringBoot 的车辆租赁管理系统,直击车辆租赁行业 “车辆状态不透明、订单流程线下化、费用计算易出错” 的核心痛点,依托 SpringBoot 高可用、易扩展的架构优势,构建 “车辆智能管控 订单全流程线上化 财务自动核算” 的…

作者头像 李华
网站建设 2026/5/10 17:35:03

UiCard终极指南:快速打造专业级卡牌游戏UI

UiCard终极指南:快速打造专业级卡牌游戏UI 【免费下载链接】UiCard Generic UI for card games like Hearthstone, Magic Arena and Slay the Spire... 项目地址: https://gitcode.com/gh_mirrors/ui/UiCard UiCard是一个专为卡牌游戏设计的Unity开源框架&am…

作者头像 李华
网站建设 2026/5/10 17:44:59

终极指南:如何用Xplist编辑器轻松管理苹果配置文件

终极指南:如何用Xplist编辑器轻松管理苹果配置文件 【免费下载链接】Xplist Cross-platform Plist Editor 项目地址: https://gitcode.com/gh_mirrors/xp/Xplist 在当今多平台开发的时代,处理苹果系统的plist配置文件常常让开发者感到头疼。无论是…

作者头像 李华