news 2026/9/24 20:11:07

【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/9/24 15:55:36

Wan2.2-T2V-A14B在虚拟人视频生成中的潜在应用场景

Wan2.2-T2V-A14B在虚拟人视频生成中的潜在应用场景 你有没有想过,有一天只需要写一段话,就能让一个栩栩如生的虚拟人“活”起来——她会微笑、转身、挥手讲解,甚至还能配合背景音乐和镜头语言完成一场完整的播报?✨ 这听起来像科幻…

作者头像 李华
网站建设 2026/9/24 22:31:00

年终大冲刺,中美科技大厂都杀疯了

年关将近,科技大厂在AI领域集体发力。 11月中旬,阿里发布全新集团战略项目千问,号称迄今最强模型;蚂蚁上线新一代AI助手“灵光”,主打30秒生成可交互应用。 随后,备受关注的DeepSeek推出新模型&#xff0…

作者头像 李华
网站建设 2026/9/23 5:52:49

K8S Pod优先级与抢占策略详解

一、Pod优先级优先级是什么?优先级代表一个Pod相对其他Pod的重要性优先级有什么用优先级可以保证重要的Pod被调用运行如何使用优先级和抢占配置优先级类PriorityClass创建Pod是为其设置对应的优先级PriorityClassPriorityClass是一个全局资源对象,它定义…

作者头像 李华
网站建设 2026/9/1 20:50:58

FFXIV快速启动器完整使用指南:提升游戏体验的终极工具

FFXIV快速启动器完整使用指南:提升游戏体验的终极工具 【免费下载链接】FFXIVQuickLauncher Custom launcher for FFXIV 项目地址: https://gitcode.com/GitHub_Trending/ff/FFXIVQuickLauncher FFXIV快速启动器是一款专为《最终幻想14》玩家设计的自定义启动…

作者头像 李华
网站建设 2026/9/1 6:18:55

基于SpringBoot+Vue的音乐管理系统(源码+lw+部署文档+讲解等)

课题介绍基于 SpringBootVue 的音乐管理系统,直击音乐资源管理 “文件存储散乱、播放交互差、权限划分模糊” 的核心痛点,依托 SpringBoot 后端高效的数据处理能力 Vue 前端轻量化交互优势,构建 “资源集中管理 沉浸式播放 精细化权限” 的…

作者头像 李华
网站建设 2026/9/21 18:52:22

视频流畅度翻倍秘诀:Dain-App AI插帧完全指南

视频流畅度翻倍秘诀:Dain-App AI插帧完全指南 【免费下载链接】Dain-App Source code for Dain-App 项目地址: https://gitcode.com/gh_mirrors/da/Dain-App 想让卡顿视频瞬间变得丝滑流畅?Dain-App这款开源AI视频插帧工具正是你需要的解决方案。…

作者头像 李华