Scanner-Klasse in Java

Die Java Scanner-Klasse ist Teil des java.util-Pakets. Es wurde in der Java 1.5-Version eingeführt. Der Scanner wird hauptsächlich verwendet, um Benutzereingaben zu erhalten und sie in primitive Datentypen wie int, double oder den Standard-String zu parsen. Es handelt sich um eine Hilfsklasse zum Parsen von Daten mithilfe regulärer Ausdrücke durch die Generierung von Tokens.

Java Scanner-Klassenkonstruktoren

Wenn Sie sich die Scanner-Klasse ansehen, gibt es viele Konstruktoren.

Scanner Class Constructors

Die meisten Konstruktoren verwenden eines der drei Objekte:

  1. InputStream – am häufigsten, wo wir System.in übergeben, um Benutzereingaben zu erhalten.
  2. Datei oder Pfad – Wir können auch Dateidaten scannen und mit den Werten aus der Datei arbeiten.
  3. String – Wir können auch einen Scanner für eine Zeichenfolgenquelle erstellen und Werte daraus parsen.

Wenn Sie das zweite Argument betrachten, dient es dazu, einen Zeichensatz anzugeben, wenn Sie nicht den Standardzeichensatz für das Parsen verwenden möchten.

Wichtige Methoden der Scanner-Klasse

Schauen wir uns einige der am häufigsten verwendeten Methoden der Scanner-Klasse an.

  • useDelimiter(String pattern) – der Trennzeichen für den Scanner. Das Standard-Trennzeichen ist Leerzeichen.
  • hasNext() – gibt true zurück, wenn es ein weiteres Token im Eingabestream gibt. Es handelt sich um eine blockierende Methode, die auf Benutzereingaben wartet.
  • next() – gibt das nächste Token des Scanners zurück. Es wird in Verbindung mit der Methode hasNext() verwendet.
  • close() – Der Scanner verbraucht viele Ressourcen. Verwenden Sie diese Methode, um ihn zu schließen und die Systemressourcen freizugeben, wenn Sie fertig sind.

Es gibt viele Hilfsmethoden, um das Eingabetoken direkt in int, short, long, byte, BigDecimal usw. zu überprüfen und zu analysieren.

Schritte zum Initialisieren und Verwenden des Scanners

  1. Der erste Schritt besteht darin, die Scannerklasse mithilfe des entsprechenden Konstruktors basierend auf dem Eingabetyp wie InputStream, Datei oder Zeichenkette zu initialisieren. Wenn nötig, setzen Sie den Begrenzer und den Zeichensatz fest.
  2. Der zweite Schritt besteht darin, auf das Eingabetoken mit der Methode hasNext() zu warten.
  3. Dann verwenden Sie die Methode next(), um das Token zu lesen und sie nacheinander zu verarbeiten.

Wie funktioniert der Scanner?

  • Die Scannerklasse zerlegt ihre Eingabe in Token mithilfe des angegebenen Begrenzungsmusters.
  • Die Methode next() wird verwendet, um die Tokens nacheinander zu lesen und sie zu verarbeiten.
  • Schließen Sie schließlich die Scanner-Instanz, um die Systemressourcen freizugeben.

Scanner-Beispiele

Lassen Sie uns einige der üblichen Verwendungen der Scanner-Klasse mit Beispielscodeausschnitten betrachten.

1. Benutzereingabe lesen

Dies ist die häufigste Verwendung der Scanner-Klasse. Wir können mit System.in als Eingabequelle instanziieren und die Benutzereingabe lesen.

// Benutzereingabe lesen
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();

Ausgabe:

Please enter your name
Pankaj
Hello Pankaj

Nun, es sieht einfach aus und funktioniert gut. Aber der obige Code hat ein Problem. Können Sie den Code überprüfen und versuchen, es zu identifizieren, ohne den nächsten Abschnitt zu lesen?

Lassen Sie uns sehen, was passiert, wenn ich meinen vollständigen Namen in die Eingabe schreibe.

Please enter your name
Pankaj Kumar
Hello Pankaj

Jetzt haben Sie es vermutlich verstanden, es passiert, weil das Leerzeichen das Trennzeichen ist. Der Scanner teilt die Eingabe in zwei Token – Pankaj und Kumar. Aber wir rufen die Methode next() nur einmal auf, also wird nur „Hallo Pankaj“ gedruckt.

Wie beheben wir das?

Es ist einfach. Wir können das Trennzeichen auf ein Zeilenendezeichen mit der Methode useDelimiter() ändern.

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. Parsen von Dateidaten mit Scanner

Schauen wir uns ein einfaches Beispiel an, um CSV-Dateien mithilfe der Scanner-Klasse zu lesen und zu parsen. Nehmen wir an, wir haben eine employees.csv-Datei mit dem folgenden Inhalt.

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

Lassen Sie uns die Datei lesen und eine Liste von Mitarbeitern in unserem Java-Programm erhalten.

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 + "]";
	}
}
  • // Scanner für die CSV-Datei erstellen
  • // Begrenzer als Zeilenumbruch setzen, um eine Zeile als ein einzelnes Token zu lesen
  • // Liste der Mitarbeiter erstellen

// Scanner schließen

// Mitarbeiterdatensätze ausgeben

// Scanner für den Zeichenketten-Datensatz erstellen

// Begrenzer als Komma setzen
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);

// Scanner schließen
sc1.useDelimiter("\\D");

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

Der erste Schritt besteht darin, den Scanner für die CSV-Datei zu erstellen und den Zeilenumbruch als Begrenzer festzulegen.
sc1.close();

Dann für jede Zeile, die einen Mitarbeiterdatensatz im CSV-Format enthält, diesen mithilfe eines weiteren Scanners und Komma als Begrenzer parsen. Die parseEmployeeData()-Funktion parst jede Zeile und erstellt ein Employee-Objekt.

1
2
345
67
8
9
10

Zuletzt fügen wir das Mitarbeiterobjekt der Liste hinzu und geben es aus.

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

3. Java Scanner Regular Expression Beispiel

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