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

大多数构造函数使用三个对象之一:
- InputStream – 最常见的是我们传递 System.in 来接收用户输入。
- 文件或路径 – 我们也可以扫描文件数据并使用文件中的值。
- 字符串 – 我们也可以为字符串来源创建一个扫描器,并从中解析值。
如果您查看第二个参数,它是用来指定字符集的,如果您不想使用默认字符集进行解析。
Scanner 类的重要方法
让我们看一些最常用的 Scanner 类方法。
- useDelimiter(String pattern) – 用于扫描器的分隔符。默认分隔符是空白符。
- `hasNext()` – 如果输入中还有另一个标记,则返回true。这是一个阻塞方法,它将持续等待用户输入。
- `next()` – 从扫描器返回下一个标记。它与`hasNext()`方法一起使用。
- `close()` – 扫描器资源消耗较大,因此在完成后,请使用此方法关闭它并释放系统资源。
有许多实用方法可检查并直接解析输入标记为int、short、long、byte、BigDecimal等。
初始化和使用Scanner的步骤
- 第一步是通过使用适当的构造函数初始化扫描器类,例如InputStream、File或String。如果需要,设置分隔符和字符集。
- 第二步是使用`hasNext()`方法等待输入标记。
- 然后使用`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]]
Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java