Java中的Scanner類

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

Java Scanner類構造函數

如果你看看Scanner類,會發現有很多構造函數。

Scanner Class Constructors

大多數構造函數都使用以下三個對象之一:

  1. InputStream – 最常見的是我們將System.in傳遞給它來接收用戶輸入。
  2. 文件或路徑 – 我們也可以掃描文件數據並使用文件中的值。
  3. 字符串 – 我們也可以為字符串源創建一個scanner,並從中解析值。

如果你看看第二個參數,它是用來指定字符集的,如果你不想使用默認的字符集來解析。

Scanner類的重要方法

讓我們來看一些最常用的Scanner類方法。

  • useDelimiter(String pattern) – 用於scanner的分隔符。默認分隔符是空白字符。
  • hasNext() – 如果輸入中還有其他標記,則返回true。這是一個阻塞方法,它將等待用戶輸入。
  • next() – 返回掃描器中的下一個標記。它與hasNext()方法一起使用。
  • close() – 掃描器佔用系統資源,因此在使用完成後,請使用此方法關閉它並釋放系統資源。

有許多實用方法可用於檢查和直接解析輸入的標記,如int、short、long、byte、BigDecimal等。

初始化和使用掃描器的步驟

  1. 第一步是使用適當的構造函數初始化掃描器類,根據輸入類型選擇InputStream、File或String。如有需要,設置分隔符和字符集。
  2. 第二步是使用hasNext()方法等待輸入標記。
  3. 然後使用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]]

3. Java Scanner 正則表達式示例

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