Java Scanner類是java.util包的一部分。它是在Java 1.5版本中引入的。Scanner主要用於接收用戶輸入並將它們解析為原始數據類型,如int、double或默認的String。它是一個使用正則表達式來解析數據的實用類,通過生成標記。
Java Scanner類構造函數
如果你看看Scanner類,會發現有很多構造函數。

大多數構造函數都使用以下三個對象之一:
- InputStream – 最常見的是我們將System.in傳遞給它來接收用戶輸入。
- 文件或路徑 – 我們也可以掃描文件數據並使用文件中的值。
- 字符串 – 我們也可以為字符串源創建一個scanner,並從中解析值。
如果你看看第二個參數,它是用來指定字符集的,如果你不想使用默認的字符集來解析。
Scanner類的重要方法
讓我們來看一些最常用的Scanner類方法。
- useDelimiter(String pattern) – 用於scanner的分隔符。默認分隔符是空白字符。
- hasNext() – 如果輸入中還有其他標記,則返回true。這是一個阻塞方法,它將等待用戶輸入。
- next() – 返回掃描器中的下一個標記。它與hasNext()方法一起使用。
- close() – 掃描器佔用系統資源,因此在使用完成後,請使用此方法關閉它並釋放系統資源。
有許多實用方法可用於檢查和直接解析輸入的標記,如int、short、long、byte、BigDecimal等。
初始化和使用掃描器的步驟
- 第一步是使用適當的構造函數初始化掃描器類,根據輸入類型選擇InputStream、File或String。如有需要,設置分隔符和字符集。
- 第二步是使用hasNext()方法等待輸入標記。
- 然後使用next()方法讀取標記並逐個處理它們。
掃描器的工作原理
- 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