Java中的Scanner类

Java Scanner 类是 java.util 包的一部分。它是在 Java 1.5 发布时引入的。Scanner 主要用于接收用户输入并将其解析为原始数据类型,如 int、double 或默认的字符串。它是一个实用类,通过生成标记来使用正则表达式解析数据。

Java Scanner 类构造函数

如果您查看 Scanner 类,会发现有许多构造函数。

Scanner Class Constructors

大多数构造函数使用三个对象之一:

  1. InputStream – 最常见的是我们传递 System.in 来接收用户输入。
  2. 文件或路径 – 我们也可以扫描文件数据并使用文件中的值。
  3. 字符串 – 我们也可以为字符串来源创建一个扫描器,并从中解析值。

如果您查看第二个参数,它是用来指定字符集的,如果您不想使用默认字符集进行解析。

Scanner 类的重要方法

让我们看一些最常用的 Scanner 类方法。

  • useDelimiter(String pattern) – 用于扫描器的分隔符。默认分隔符是空白符。
  • `hasNext()` – 如果输入中还有另一个标记,则返回true。这是一个阻塞方法,它将持续等待用户输入。
  • `next()` – 从扫描器返回下一个标记。它与`hasNext()`方法一起使用。
  • `close()` – 扫描器资源消耗较大,因此在完成后,请使用此方法关闭它并释放系统资源。

有许多实用方法可检查并直接解析输入标记为int、short、long、byte、BigDecimal等。

初始化和使用Scanner的步骤

  1. 第一步是通过使用适当的构造函数初始化扫描器类,例如InputStream、File或String。如果需要,设置分隔符和字符集。
  2. 第二步是使用`hasNext()`方法等待输入标记。
  3. 然后使用`next()`方法读取标记并逐个处理它们。

Scanner的工作原理

  • Scanner类使用指定的分隔符模式将其输入分解为标记。
  • `next()`方法用于逐个读取标记并处理它们。
  • 最后,关闭Scanner实例以释放系统资源。

Scanner示例

让我们看一些使用Scanner类的常见用法以及示例代码片段。

1. 读取用户输入

这是Scanner类最常见的用法。我们可以使用System.in作为输入源并读取用户输入。

// 读取用户输入
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();

输出:

Please enter your name
Pankaj
Hello Pankaj

看起来很简单并且运行良好。但是,上面的代码有一个问题。在阅读下一节之前,您能否检查代码并尝试识别它?

让我们看看当我在输入中写入我的全名时会发生什么。

Please enter your name
Pankaj Kumar
Hello Pankaj

现在你一定已经明白了,这是因为空格是分隔符。扫描器将输入分成两个令牌 – Pankaj 和 Kumar。但是,我们只调用了一次next()方法,所以只打印了“Hello Pankaj”。

我们该如何修复这个问题?

很简单。我们可以使用useDelimiter()方法将分隔符更改为换行符。

Scanner sc = new Scanner(System.in);
sc.useDelimiter(System.getProperty("line.separator"));
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();

2. 使用Scanner解析文件数据

让我们通过Scanner类来查看一个简单的例子,读取和解析CSV文件。假设我有一个名为employees.csv的文件,其内容如下。

1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO

让我们读取文件并在我们的Java程序中获取一个员工列表。

package com.journaldev.java;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ScannerExamples {

	public static void main(String[] args) throws IOException {

		// create scanner for the CSV file
		Scanner sc = new Scanner(new File("employees.csv"));

		// set delimiter as new line to read one line as a single token
		sc.useDelimiter(System.getProperty("line.separator"));

		// create the List of Employees
		List<Employee> emps = new ArrayList<>();

		while (sc.hasNext()) {
			Employee emp = parseEmployeeData(sc.next());
			emps.add(emp);
		}

		// close the scanner
		sc.close();

		// print employee records
		System.out.println(emps);
	}

	private static Employee parseEmployeeData(String record) {
		// create scanner for the String record
		Scanner sc = new Scanner(record);

		// set delimiter as comma
		sc.useDelimiter(",");

		Employee emp = new Employee();
		emp.setId(sc.nextInt());
		emp.setName(sc.next());
		emp.setRole(sc.next());

		// close the scanner
		sc.close();

		return emp;
	}

}

class Employee {
	private int id;
	private String name;
	private String role;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "Emp[" + id + "," + name + "," + role + "]";
	}
}
  • // 为CSV文件创建Scanner
  • // 将分隔符设置为换行,以将一行读取为一个单独的标记
  • // 创建员工列表

// 关闭Scanner

// 打印员工记录

// 为字符串记录创建Scanner

// 将分隔符设置为逗号
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);

// 关闭Scanner
sc1.useDelimiter("\\D");

while(sc1.hasNext()) {
	System.out.println(sc1.next());
}

第一步是为CSV文件创建Scanner并将换行符设置为分隔符。
sc1.close();

然后,对于包含以CSV格式存储的员工记录的每一行,使用另一个Scanner并将逗号作为分隔符进行解析。parseEmployeeData()函数解析每一行并创建Employee对象。

1
2
345
67
8
9
10

最后,我们将员工对象添加到列表并进行打印。

输出: [Emp[1,Jane Doe,CEO], Emp[2,Mary Ann,CTO], Emp[3,John Lee,CFO]]

3. Java Scanner正则表达式示例

Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java