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/

  • 33
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以帮你设计一个简单的笔记本管理系统。首先,你需要定义数据模型来存储笔记本信息,例如品牌、型号、颜色和价格等。然后,你可以使用Java编写控制台应用或者图形用户界面 (GUI) 应用来实现该系统。以下是一个简单的控制台应用的代码示例: ```java import java.util.ArrayList; import java.util.Scanner; public class NotebookManager { private ArrayList<Notebook> notebookList; public NotebookManager() { this.notebookList = new ArrayList<Notebook>(); } public void addNotebook(Notebook notebook) { this.notebookList.add(notebook); } public void removeNotebook(Notebook notebook) { this.notebookList.remove(notebook); } public void displayNotebookList() { System.out.println("Notebook List:"); for (Notebook notebook : this.notebookList) { System.out.println(notebook); } } public static void main(String[] args) { NotebookManager notebookManager = new NotebookManager(); Scanner scanner = new Scanner(System.in); int choice = 0; do { System.out.println("Notebook Management System"); System.out.println("==========================="); System.out.println("1. Add a new notebook"); System.out.println("2. Remove an existing notebook"); System.out.println("3. Display notebook list"); System.out.println("4. Exit"); System.out.println("Enter your choice:"); choice = scanner.nextInt(); switch (choice) { case 1: System.out.println("Add a new notebook"); System.out.println("==================="); System.out.println("Enter brand name:"); String brand = scanner.next(); System.out.println("Enter model:"); String model = scanner.next(); System.out.println("Enter color:"); String color = scanner.next(); System.out.println("Enter price:"); double price = scanner.nextDouble(); Notebook newNotebook = new Notebook(brand, model, color, price); notebookManager.addNotebook(newNotebook); break; case 2: System.out.println("Remove an existing notebook"); System.out.println("============================="); notebookManager.displayNotebookList(); System.out.println("Enter index to remove:"); int index = scanner.nextInt(); Notebook notebook = notebookManager.notebookList.get(index); notebookManager.removeNotebook(notebook); break; case 3: System.out.println("Display notebook list"); System.out.println("======================="); notebookManager.displayNotebookList(); break; case 4: System.out.println("Goodbye!"); break; default: System.out.println("Invalid choice!"); } } while (choice != 4); } } class Notebook { private String brand; private String model; private String color; private double price; public Notebook(String brand, String model, String color, double price) { this.brand = brand; this.model = model; this.color = color; this.price = price; } public String getBrand() { return brand; } public String getModel() { return model; } public String getColor() { return color; } public double getPrice() { return price; } @Override public String toString() { return String.format("Brand: %s, Model: %s, Color: %s, Price: %.2f", brand, model, color, price); } } ``` 这个笔记本管理系统可以执行以下操作: 1. 添加一个新的笔记本 2. 删除一个已有的笔记本 3. 显示当前的笔记本列表 4. 退出系统 你可以选择用一个简单的菜单界面命令来执行这些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值