Java 笔记 08:Scanner 类的使用方法

一、前言

记录时间 [2024-04-28]

系列文章简摘:
Java 笔记 01:Java 概述,MarkDown 常用语法整理
Java 笔记 04:Java 数据类型基础,数据类型转换,及其相关场景拓展
Java 笔记 05:变量和常量相关知识,Java 编程的命名规范
Java 笔记 06:基本运算符概述,分类,和使用方式

更多 Java 相关文章,请参考上面专栏哦。

本文整理了一些 Scanner 类的使用方法,注意区分 next() 与 nextLine() 方法。


二、Scanner 概述

在 Java 中,Scanner 类是用来获取用户输入的工具类。它提供了多种方法来解析基本数据类型和字符串。可以使用 Scanner 来读取标准输入(键盘输入),也可以读取文件或者其他输入源。

1. 构造方法

Scanner 类的使用,通过创建一个扫描器对象

且 Scanner 类是属于 IO 流的类,用完之后需要关闭,否则会占用资源。

import java.util.Scanner;

public static void main(String[] args) {

	// 创建一个扫描器对象,用于接收键盘数据
	Scanner scanner = new Scanner(System.in);
    
    System.out.println("请输入数据:");
    String str = scanner.nextLine();
    System.out.println("输出的内容为:" + str);
    
    // 凡是属于 IO 流的类如果不关闭会一直占用资源
    scanner.close();
}

三、常规用法

1. next / nextLine

next()nextLine() 是 Java 中用于在开发命令行应用程序时从控制台读取输入的方法。

关于 next()

  • 一定要读取到有效字符后才可以结束输入。
  • 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。(例如:hello world hello 前空格不影响 hello 输出,hello 后空格则标志输入结束,则 world 不会被输出)
  • 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

关于 nextLine()

  • 以 Enter 为结束符,也就是说 nextLine() 方法返回的是输入回车之前的所有字符。
  • 可以获得空白。

案例

在这个示例中,如果使用 next() 来读取姓名,用户输入"Zhang San",name 变量将只包含"Zhang",因为 next() 会读取直到第一个空白字符。但是,如果使用 nextLine(),它将读取整行,包括"Zhang San"。

import java.util.Scanner;

public class InputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输姓名:");
        String name = scanner.next();
        // String name = scanner.nextLine(); // 读取整行

        System.out.print("请输入年龄:");
        int age = scanner.nextInt();

        System.out.println("姓名:" + name);
        System.out.println("年龄:" + age);

        scanner.close();
    }
}

2. hasNext / hasNextLine

hasNext()hasNextLine() 是 Java 中用于检查是否还有输入可供读取的方法,它们通常与 next()nextLine() 一起使用。

此外,这些方法通常与循环结构一起使用,以便在读取输入之前先检查是否还有输入可供读取。

关于 hasNext()

  • 这个方法是 Java 中 Scanner 类的一部分。
  • 它检查输入流中是否有下一个标记(通常是一个单词)可供读取。
  • 如果有下一个标记可用,则返回 true;否则返回 false。
  • 这个方法不会消耗输入流中的任何字符。

关于 hasNextLine()

  • 这个方法也是 Java 中 Scanner 类的一部分。
  • 它检查输入流中是否有下一行可供读取。
  • 如果有下一行可用,则返回 true;否则返回 false。
  • 这个方法不会消耗输入流中的任何字符。

使用方式:

import java.util.Scanner;

public class InputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 检查是否还有输入可供读取
        while (scanner.hasNextLine()) {
            // 读取下一行输入
            String line = scanner.nextLine();
            System.out.println("输入的是:" + line);
        }

        // 关闭 scanner 对象
        scanner.close();
    }
}


现象分析

使用 hasNext() 方法时碰到的一个现象

在用户有输入时,scanner.hasNext() 返回结果为 true,就理论而言,没有输入时,其返回结果为 false;

而问题:在用户输入之前,!scanner.hasNext() 不会成立,为什么???

根据帮助文档中的 hasNext:

Returns true if the next complete token matches the specified pattern.
如果下一个完整标记与指定模式匹配,则返回 true。

A complete token is prefixed and postfixed by input that matches the delimiter pattern.
完整的标记由与分隔符模式匹配的输入作为前缀和后缀。

This method may block while waiting for input.
该方法在等待输入时可能会阻塞。

The scanner does not advance past any input.
扫描仪不会前进超过任何输入。

重点:阻塞 block

该方法在等待输入时可能会阻塞,扫描仪不会前进超过任何输入。

结论

hasNext() 判断用户有没有输入,而该方法在等待输入时可能会阻塞,所以用户没有输入,它就阻塞,所以程序不会下去。

Debug 时,执行到 if (!scanner.hasNext()) 这句会发生阻塞,所以,if (!scanner.hasNext()) { 句子 } 里面句子就不会执行。

阻塞后,用户进行了输入,此时 scanner.hasNext() 就为 true


验证方式

在用户没有输入时,执行下面的输出 System.out.println( !scanner.hasNext() ); 会被阻塞,直到用户有了输入。

输入后,System.out.println( !scanner.hasNext() ); 的执行结果为 false,

可见 System.out.println 执行时 scanner 已经完成了用户输入。

所以,它永远也得不到 true 即用户没输入状态的结果(关键:阻塞!!!)


四、数值操作

编写一个简单的 Java 程序,用于从键盘输入一系列数值,然后计算它们的总和,以及平均数。下面是代码示例:

import java.util.Scanner;

public class SumAndAverage {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入数值的个数
        System.out.print("请输入要计算的数值个数:");
        int count = scanner.nextInt();

        // 初始化变量用于存储总和
        double sum = 0;

        // 读取用户输入的数值,并计算总和
        for (int i = 1; i <= count; i++) {
            System.out.print("请输入第 " + i + " 个数值:");
            double number = scanner.nextDouble();
            sum += number;
        }

        // 计算平均数
        double average = sum / count;

        // 输出结果
        System.out.println("总和为:" + sum);
        System.out.println("平均数为:" + average);

        scanner.close();
    }
}

五、总结

本文整理了一些 Scanner 类的使用方法,注意区分 next() 与 nextLine() 方法。

一些参考资料

狂神说 Java 零基础:https://www.bilibili.com/video/BV12J41137hu/
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信第三方开放平台,实现代公众号保留排版样式和图片发布文章

大家好&#xff0c;我是小悟 要想实现代公众号发布文章的功能&#xff0c;就得接入富文本编辑器&#xff0c;市面上富文本编辑器有很多&#xff0c;轻量的、重量的都有。 从开发者的角度&#xff0c;自然把轻量作为第一选择&#xff0c;因为好对接&#xff0c;怎么方便怎么来…

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(六)

目录 第六章 系统测试 6.1 功能性测试 6.1.1 商家后台功能测试 6.1.2 前台功能测试 6.2 非功能性测试 6.3 本章小结 结束语 参考文献 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现&#xff08;五&#xff09; 相关免费源码资源 乐优商城…

2024年【制冷与空调设备运行操作】最新解析及制冷与空调设备运行操作免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作最新解析是安全生产模拟考试一点通生成的&#xff0c;制冷与空调设备运行操作证模拟考试题库是根据制冷与空调设备运行操作最新版教材汇编出制冷与空调设备运行操作仿真模拟考试。2024年【制冷…

不只有 Spring,这四款Java 基础开发框架同样值得关注!

Java 开发不只有 Spring &#xff0c;今天给大家推荐几个同样优秀的 Java 基础开发框架&#xff0c;为日常项目开发提供更多的选择。答应我&#xff0c;请不要再叫我 Spring 小子了&#xff0c;​好吗&#xff1f; 项目概览&#xff1a; Guice&#xff1a;轻量级依赖注入框架 …

构建本地大语言模型知识库问答系统

MaxKB 2024 年 4 月 12 日&#xff0c;1Panel 开源项目组正式对外介绍了其官方出品的开源子项目 ——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品…

Intelij Idea Push失败,出现git Authentication failed(验证失败)

目录 1、出现问题的原因 2、解决之法 1、出现问题的原因 能出现这种问题&#xff0c;最主要的原因是链接对上了&#xff0c;但用户验证失败了&#xff0c;即登录失败。 因为服务器转移或者换了git项目链接&#xff0c;导致你忘记了用户名密码&#xff0c;随意输入之后&…

P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量

这节课主要是怎么对Attribute进行在进行到游戏角色前先进行处理,以及游戏效果如何回调 AuraAttributeSet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "AttributeSet.h&…

如何禁用WordPress的自动更新(包括主题、插件和核心文件)

这几天发现我的一个网站突然打不开了&#xff0c;提示“此站点遇到了致命错误”,如图&#xff1a; 这个网站一直都是正常运行的&#xff0c;最近也没有过什么更新&#xff0c;按理说不应该会出现问题&#xff0c;我担心可能是主机方面做了什么调整导致&#xff0c;所以联系了Ho…

品鉴中的个人偏好:如何找到适合自己的红酒风格

品鉴红酒时&#xff0c;个人偏好起着至关重要的作用。不同的人对红酒的风格、口感和特点有着不同的喜好和需求。对于云仓酒庄雷盛红酒而言&#xff0c;如何找到适合自己的红酒风格&#xff0c;是品鉴过程中需要关注的问题。 首先&#xff0c;了解自己的口味和喜好是找到适合自己…

spi接口的基本概念、引脚定义及注意事项

目录 基本概念 引脚定义 注意事项 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行接口技术&#xff0c;广泛应用于微控制器和各种外围设备之间的短距离通信。 基本概念 SPI接口允许微控制器以串行方式与一个或多个外围设备进行通信。它是一种高速、…

B端:销售投入远超研发投入,想让B端漂亮体验好,非常难。

足够的研发费用是确保B端系统研发体验好、品质佳的重要条件之一。在B端系统研发过程中&#xff0c;足够的研发费用可以用于以下方面&#xff1a; 1.人才投入&#xff1a; 招聘高素质的研发团队成员&#xff0c;包括开发工程师、测试工程师、产品设计师、运维工程师等&#xf…

【进程通信】利用管道创建进程池(结合代码)

文章目录 什么叫进程池进程池的优点 创建进程池代码实现&#xff1a; 什么叫进程池 我们知道&#xff0c;一个进程创建子进程通常是为了让这个子进程去为它完成某个任务。例如我们使用的指令&#xff0c;其实就是bash进程创建子进程让子进程去执行的。但是我们需要考虑这样一个…

RLDP协议原理与应用

RLDP概述 l RLDP全称是Rapid Link Detection Protocol&#xff08;快速链路检测协议&#xff09;&#xff0c;是锐捷网络自主开发的&#xff0c;用于快速检测以太网链路故障的链路协议。 l 一般的以太网链路检测机制都只是利用物理连接的状态&#xff0c;通过物理层的自动协…

React | classnames

classnames 这个库在我们的项目中有大量的使用到&#xff0c;它不仅很实用&#xff0c;还非常好用&#xff0c;但还有人不知道这个库&#xff0c;我真的是十分心痛。 通过 classnames&#xff0c;我们可以给组件设置多个 className&#xff0c;还可以根据需要动态设置 classNa…

机器学习中的CatBoost算法

我们经常遇到包含分类特征的数据集&#xff0c;为了将这些数据集拟合到Boosting模型中&#xff0c;我们对数据集应用各种编码技术&#xff0c;例如One-Hot编码或标签编码。但是应用One-Hot编码会创建一个稀疏矩阵&#xff0c;这有时可能导致模型的过拟合&#xff0c;我们使用Ca…

Oracle中rman使用记录

最近在项目中&#xff0c;遇到使用RMAN的操作来恢复数据库中某个时间归档日志&#xff0c;RMAN的原理和理解&#xff0c;网友们百度了解一下。我重点将实操部分了。直接上实验环节&#xff0c;让网友更懂。&#xff08;特别提醒&#xff1a;我是1:1用VMware克隆数据库进行RMAN还…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

开发规范:API安全

开发规范&#xff1a;API安全 API是现代移动、SaaS和web应用程序的关键组成部分&#xff0c;可以应用在面向客户、合作伙伴和内部应用程序中。API可以暴露应用程序逻辑和敏感数据。不安全的API很容易成为黑客攻击的目标&#xff0c;使他们能够访问安全的服务器或网络。攻击者可…

NXP i.MX8系列平台开发讲解 - 3.9 Linux PCIe协议相关介绍(二)

目录 1. PCIe 传输层协议 2. TLP介绍 2.1 TLP包格式 2.2 TLP包的种类 2.3 TLP 包传输例子 2.4 TLP 路由规则 根据上一章的知识&#xff0c;对于PCIe的发展和基础知识有了大概了解&#xff0c;本章节将会讲解PCIe的一些工作原理&#xff0c;使用的协议&#xff0c;通信交互…

挑战一周完成Vue3项目Day2:路由配置+登录模块+layout组件+路由鉴权

一、路由配置 经过分析&#xff0c;项目一共需要4个一级路由&#xff1a;登录&#xff08;login&#xff09;、主页&#xff08;home&#xff09;、404、任意路由&#xff08;重定向到404&#xff09;。 1、安装路由插件 pnpm install vue-router 2、创建路由组件 在src目…
最新文章