当前位置: 首页 > 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:金控控制台输入,还能扫描文件


http://www.mrgr.cn/news/69294.html

相关文章:

  • 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令
  • .NET 9 中 IFormFile 的详细使用讲解
  • Python数据分析NumPy和pandas(二十九、其他Python可视化工具)
  • 网页作业9
  • 【Hadoop】【hdfs】【大数据技术基础】课程 作业四 可视化工具的使用 大数据基础编程、实验和案例教程(第2版)
  • AndroidStudio-常用布局
  • 第 1 章 - Go语言简介
  • 软考:论容器编排
  • 介绍一下数组(c基础)(详细版)
  • 2024年3月电子学会Python等级考试试卷(五级)真题,包含答案
  • DirectShow过滤器开发-写AVI视频文件过滤器
  • C++builder中的人工智能(16):神经网络中的SoftPlus激活函数
  • ubuntu24.04安装matlab失败
  • Rust为什么要搞个match匹配,直接用==判断不行吗(Rust match、Rust ==、Rust模式匹配)
  • vue2 和 vue3的区别
  • Mac 安装protobuf2.5.0
  • 【竞技宝】LOL:JKL回归IG已无可能?
  • 对于app开发者对接广告联盟,需要哪些资质以及变现如何?
  • arkUI:绝对定位、相对定位、Z序控制(position、offset、zIndex)
  • 【C#设计模式(2)——工厂模式】
  • 【初阶数据结构与算法】线性表之单链表的定义与实现
  • 就是这个样的粗爆,手搓一个计算器:十进制到百分比转换器
  • 稳压二极管详解
  • 电磁兼容(EMC):GB 4343.1喀呖声 详解
  • js 好用的字符操作方法
  • 模块的导入