当前位置: 首页 > news >正文

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类,主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容,但我们通常更喜欢它用于控制台输入,因为扫描文件可以通过文件流来完成。接下来,我们将通过几个简单的示例来讲解 Scanner 类的使用。

1 扫描控制台输入

通常,我们会使用 Scanner 类来扫描控制台输入,这对于初学 Java 的人来说非常有用,因为它可以轻松地获取用户输入的数据。

示例 1:基本输入

import java.util.Scanner;public class ConsoleInputExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in); // 创建 Scanner 对象,从标准输入流中读取数据System.out.print("请输入一个整数:");int num = scanner.nextInt(); // 获取用户输入的整数System.out.println("您输入的整数是:" + num);scanner.nextLine(); // 读取换行符,避免影响下一次读取System.out.print("请输入一个字符串:");String str = scanner.nextLine(); // 获取用户输入的字符串System.out.println("您输入的字符串是:" + str);scanner.close(); // 关闭 Scanner 对象}
}

在这个示例中,我们创建了一个 Scanner 对象,并使用 nextInt() 方法读取用户输入的整数,使用 nextLine() 方法读取用户输入的字符串。注意,在读取整数后,我们需要调用 nextLine() 方法来读取换行符,以避免影响下一次读取。

示例 2:多行输入

import java.util.Scanner;public class MultiLineInputExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in); // 创建 Scanner 对象,从标准输入流中读取数据System.out.println("请输入多行文本,以空行结束:");StringBuilder sb = new StringBuilder(); // 创建 StringBuilder 对象,用于保存读取的文本String line = scanner.nextLine(); // 读取输入流中的第一行while (!line.isEmpty()) { // 如果读取的行不为空,则继续读取下一行sb.append(line).append("\n"); // 将当前行的内容添加到 StringBuilder 对象中,并换行line = scanner.nextLine(); // 读取下一行}System.out.println("您输入的文本是:\n" + sb.toString()); // 打印读取的文本scanner.close(); // 关闭 Scanner 对象}
}

在这个示例中,我们使用 nextLine() 方法读取多行文本,直到用户输入空行为止。

示例 3:其他常用方法

import java.util.Scanner;public class ScannerMethodsExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in); // 创建 Scanner 对象,从标准输入流中读取数据System.out.print("请输入一个整数:");if (scanner.hasNextInt()) { // 判断输入流中是否有下一个整数int num = scanner.nextInt(); // 读取输入流中的下一个整数System.out.println("您输入的整数是:" + num);} else {System.out.println("输入的不是整数!");}scanner.nextLine(); // 读取输入流中的换行符System.out.print("请输入多个单词,以空格分隔:");while (scanner.hasNext()) { // 判断输入流中是否还有下一个标记String word = scanner.next(); // 读取输入流中的下一个单词System.out.println("您输入的单词是:" + word);}scanner.nextLine(); // 读取输入流中的换行符System.out.print("请输入一个实数:");if (scanner.hasNextDouble()) { // 判断输入流中是否有下一个实数double num = scanner.nextDouble(); // 读取输入流中的下一个实数System.out.println("您输入的实数是:" + num);} else {System.out.println("输入的不是实数!");}scanner.nextLine(); // 读取输入流中的换行符System.out.print("请输入一个字符串:");if (scanner.hasNextLine()) { // 判断输入流中是否有下一行String line = scanner.nextLine(); // 读取输入流中的下一行System.out.println("您输入的字符串是:" + line);} else {System.out.println("输入的不是字符串!");}scanner.close(); // 关闭 Scanner 对象}
}

在这个示例中,我们展示了 Scanner 类的其他常用方法,如 hasNextInt()hasNext()hasNextDouble()hasNextLine()

2 扫描文件

Scanner 类也可以用于扫描文件内容,以下是一个简单的示例:

示例 1:逐行读取文件

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class FileScannerExample {public static void main(String[] args) {try {// 创建 File 对象,表示要扫描的文件File file = new File("docs/安装环境.md");Scanner scanner = new Scanner(file); // 创建 Scanner 对象,从文件中读取数据while (scanner.hasNextLine()) { // 判断文件中是否有下一行String line = scanner.nextLine(); // 读取文件中的下一行System.out.println(line); // 打印读取的行}scanner.close(); // 关闭 Scanner 对象} catch (FileNotFoundException e) {System.out.println("文件不存在!");}}
}

在这个示例中,我们创建了一个 File 对象,表示要扫描的文件。然后,我们使用 Scanner 类的构造方法来创建 Scanner 对象,并将文件作为参数传递给构造方法。在 while 循环中,我们使用 hasNextLine() 方法来判断文件中是否有下一行,如果有,则使用 nextLine() 方法读取该行字符串,并使用 println() 方法将其打印出来。最后,我们在程序结束前使用 close() 方法关闭 Scanner 对象。

示例 2:读取整个文件内容

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class WholeFileScannerExample {public static void main(String[] args) {try {// 创建 File 对象,表示要扫描的文件Scanner scanner = new Scanner(new File("docs/安装环境.md")); // 创建 Scanner 对象,从文件中读取数据scanner.useDelimiter("\\Z"); // 设置分隔符为文件结尾if (scanner.hasNext()) { // 判断文件中是否有下一行String content = scanner.next(); // 读取文件中的下一行System.out.println(content); // 打印读取的行}scanner.close(); // 关闭 Scanner 对象} catch (FileNotFoundException e) {System.out.println("文件不存在!");}}
}

在这个示例中,我们使用 useDelimiter("\\Z") 方法将分隔符设置为文件结尾,以便读取整个文件内容。

3 查找匹配项

Scanner 类还提供了一些以 find 开头的方法,用于查找匹配项。以下是一些示例:

示例 1:查找字符串中的单词

import java.util.Scanner;public class FindExample {public static void main(String[] args) {String input = "good good study, day day up.";Scanner scanner = new Scanner(input);String result;// 使用 findInLine() 方法查找字符串中的单词result = scanner.findInLine("study");System.out.println("findInLine(): " + result); // 输出 "study"// 使用 findWithinHorizon() 方法查找字符串中的单词scanner = new Scanner(input);result = scanner.findWithinHorizon("study", 20);System.out.println("findWithinHorizon(): " + result); // 输出 "study"scanner.close(); // 关闭 Scanner 对象}
}

在这个示例中,我们使用 findInLine() 方法和 findWithinHorizon() 方法分别查找字符串中的单词 “study”。

示例 2:使用正则表达式查找文件中的关键字

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Pattern;public class RegexFindExample {public static void main(String[] args) {try {// 创建 File 对象,表示要扫描的文件Scanner scanner = new Scanner(new File("docs/安装环境.md")); // 创建 Scanner 对象,从文件中读取数据Pattern pattern = Pattern.compile("op..jdk");String result;while ((result = scanner.findWithinHorizon(pattern, 0)) != null) {System.out.println("findWithinHorizon(): " + result);}scanner.close(); // 关闭 Scanner 对象} catch (FileNotFoundException e) {System.out.println("文件不存在!");}}
}

在这个示例中,我们使用正则表达式 op..jdk 来查找文件中的关键字 “openjdk”。

4 小结

总之,Scanner 类是一个功能强大的输入处理工具类,不仅可以扫描控制台的输入流,还可以扫描文件,并且提供了多种方法来读取不同类型的数据,如 next()nextInt()nextLine()nextDouble() 等。此外,还可以通过 useDelimiter() 方法设置分隔符,通过 findInLine()findWithinHorizon() 方法查找匹配项等。熟练掌握 Scanner 类的使用,将极大地提高我们在处理输入数据时的效率和灵活性。

5 思维导图

在这里插入图片描述

6 参考链接

Java Scanner:金控控制台输入,还能扫描文件

相关文章:

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类,主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容,但我们通常更喜欢它用于控制台输入,因为扫描文件可以通过文件流来完成。接下来,我们将通过几个简单的示例来讲解…...

使用纯HTML和CSS绘制圣诞树:打造网页中的冬日奇景

### HTML & CSS 实现节日圣诞树:一步步打造你的冬季主题网页 在这篇文章中,我们将使用纯HTML和CSS创建一棵节日圣诞树。通过简单的代码,您可以在网页上实现一棵带有星星、彩球装饰的圣诞树,为网站增添节日氛围。 ### 实现思…...

深度学习-图像评分实验(TensorFlow框架运用、读取处理图片、模型建构)

目录 0、实验准备 ①实验环境 ②需要下载的安装包 ③注意事项(很关键,否则后面内容看不懂) ④容易出现的问题 1、查看数据并读取数据。 2、PIL库里的Image包进行读取(.resize更改图片尺寸,并将原始数据归一化处…...

羲和数据集收集器0.9

为了进一步完善代码,增强其文字抓取能力和文件读取能力,我们做以下改进: 增强 DOCX 文档的文本提取:不仅提取段落和文本框内容,还提取表格中的文本。 增强 PDF 文档的文本提取:不仅提取页面文本和注释,还提取表格中的文本。 优化文本清理:确保文本清理更加彻底,避免不…...

哈尔滨等保测评常见误区破解:避免陷入安全盲区

在当今信息化社会,网络安全已成为各行各业不可忽视的重要议题。等级保护(简称“等保”)作为我国网络安全的基本制度,旨在通过划分不同安全保护等级,对信息系统实施分等级的安全保护。然而,在实施等保测评的…...

Python学习------第四天

Python的判断语句 一、布尔类型和比较运算符 二、 if语句的基本格式 if语句注意空格缩进!!! if else python判断语句的嵌套用法:...

【Django】配置文件 settings.py

【Django】配置文件 settings.py 和Flask框架不同,Django框架项目在创建的时会默认生成配置文件settings.py,在深入学习Django框架前,我们先简单了解settings.py文件内非注释代码, from pathlib import Path BASE_DIR Path(__f…...

量化交易系统开发-实时行情自动化交易-Okex K线数据

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取K线数…...

【基于轻量型架构的WEB开发】课程 12.5 数据回写 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.5 数据回写 12.5.1 普通字符串的回写 接下来通过HttpServletResponse输出数据的案例,演示普通字符串的回写,案例具体实现步骤如下。 1 创建一个数据回写类DataController,在DataController类中定义 showDataByResponse()方法&#xff…...

apache-seata-2.1.0 AT模式使用篇(配置简单)

最近在研究seata的AT模式,先在本地搭建了一个演示demo,看看seata是如何使用的。在网上搜的demo,配置相对来说都比较多。我最终搭建的版本,配置较少,所以写篇文章分享下,希望能帮到对seata感兴趣的小伙伴。先…...

(金蝶云星空)客户端追踪SQL

快捷键 ShitfCtryAltM 点击开始、最后操作功能、然后查看报告 SQL报告...

OAK相机:纯视觉SLAM在夜晚的应用

哈喽,OAK的朋友们,大家好啊,今天这个视频主要想分享一下袁博士团队用我们的OAK相机产出的新成果 在去年过山车SLAM的演示中,袁博士团队就展示了纯视觉SLAM在完全黑暗的环境中的极高鲁棒性。 现在袁博士团队进一步挖掘了纯视觉的潜…...

发送方确认

在使用RabbitMQ的时候,可以通过消息持久化来解决因为服务器的异常而导致的消息就是,但是还有一个问题,当消息的生产者将消息发送出去之后,消息到底有没有正确地到达服务器呢?如果消息在到达服务器之前已经丢失&#xf…...

如何使用HighBuilder前端开发神器

一,前言 前端开发是网页和应用程序设计与开发中的一个重要分支,直接涉及用户界面的构建和用户与网页的交互。前端是用户在浏览器中看到的部分,负责为用户提供良好的体验。 二,前段介绍 1. 前端的组成 前端开发主要由三个核心技…...

发现了NitroShare的一个bug

NitroShare 是一个跨平台的局域网开源网络文件传输应用程序,它利用广播发现机制在本地网络中找到其他安装了 NitroShare 的设备,从而实现这些设备之间的文件和文件夹发送。 NitroShare 支持 Windows、macOS 和 Linux 操作系统。 NitroShare允许我们为…...

如何关闭 Ubuntu22.04 LTS 的更新提醒

引言 众所周知,Ubuntu 的软件更新和版本更新提醒是又多又烦,如果不小心更新到了最新的 Ubuntu 还可能面临各种各样的问题,这里提供一个解决方法 步骤 首先按照下面步骤打开 Software & Updates 然后按照下面步骤依次点击 最后关闭即可…...

美术资源规范

很多项目都没有重视资源规范,而是不断追求更高的运行效率。然而资源规范在项目中是非常重要的,资源规范才是高效运行的前提。 在有的项目中,一个人物模型几万个面、一个建筑模型就几十万个面,贴图也不规范,1024、2048…...

UE5.4 PCG 获取地形Layer

使用AttributeFilter:属性过滤器 节点 设置地形Layer名称和权重 效果:...

用 cURL 控制 OpenSIPS3.4

opensips-cli -x mi reload_routes,重读脚本路由opensips-cli -x mi ds_list,就是 dispatcher list 的缩写,简单明了opensips-cli -x mi ds_reload,修改 OpenSIPS 数据库的 dispatcher 表之后,用此命令读到内存opensip…...

【LuatOS】基于WebSocket的同步请求框架

0x00 缘起 由于使用LuatOS PC模拟器发起快速且海量HTTP请求(1000 次/秒)时,会耗尽PC的TCP连接资源,而无法进行继续进行访问请求。故使用WebSocket搭建类似于HTTP的“同步请求相应”的通信框架,以实现与HTTP类似的功能…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...