Scanner Klasse in Java

Java Scanner-klasse maakt deel uit van het java.util-pakket. Het werd geïntroduceerd in de Java 1.5-release. De Scanner wordt voornamelijk gebruikt om invoer van gebruikers te ontvangen en deze te parseren naar primitieve gegevenstypen zoals int, double of standaard String. Het is een hulpprogramma-klasse om gegevens te parseren met reguliere expressies door tokens te genereren.

Constructoren van de Java Scanner-klasse

Als je naar de Scanner-klasse kijkt, zijn er veel constructoren.

Scanner Class Constructors

De meeste constructoren gebruiken een van de drie objecten:

  1. InputStream – het meest gebruikelijk waar we System.in doorgeven om invoer van gebruikers te ontvangen.
  2. Bestand of Pad – We kunnen ook gegevens uit een bestand scannen en werken met de waarden uit het bestand.
  3. String – We kunnen ook een scanner maken voor een string-bron en waarden daaruit parsen.

Als je naar het tweede argument kijkt, is het om een ​​karakterset op te geven als je niet de standaard karakterset wilt gebruiken voor het parsen.

Belangrijke methoden van de Scanner-klasse

Laten we eens kijken naar enkele van de meest gebruikte methoden van de Scanner-klasse.

  • useDelimiter(String patroon) – de scheidingsteken dat moet worden gebruikt voor de scanner. Het standaard scheidingsteken is spatie.
  • hasNext() – geeft true terug als er nog een token in de invoer is. Het is een blokkerende methode en het blijft wachten op gebruikersinvoer.
  • next() – geeft het volgende token van de scanner terug. Het wordt gebruikt in combinatie met de hasNext() methode.
  • close() – de scanner verbruikt veel systeembronnen, dus als je klaar bent, gebruik deze methode dan om het te sluiten en systeembronnen vrij te geven.

Er zijn veel hulpprogramma-methoden om het invoertoken direct te controleren en te parseren naar int, short, long, byte, BigDecimal, enz.

Stappen om de Scanner te initialiseren en te gebruiken

  1. De eerste stap is om de scannerklasse te initialiseren door de juiste constructor te gebruiken op basis van het invoertype, zoals InputStream, File of String. Stel indien nodig de scheidingsteken en tekenset in.
  2. De tweede stap is om te wachten op het invoertoken met behulp van de hasNext() methode.
  3. Gebruik vervolgens de next() methode om het token te lezen en verwerk ze een voor een.

Hoe werkt de Scanner?

  • De Scanner-klasse breekt de invoer in tokens met behulp van het opgegeven scheidingstekenpatroon.
  • De next() methoden worden gebruikt om de tokens een voor een te lezen en te verwerken.
  • Eindelijk, sluit de Scanner-instantie om de systeembronnen vrij te geven.

Voorbeelden van Scanner

Laten we eens kijken naar enkele veelvoorkomende toepassingen van de Scanner-klasse met voorbeeldcode.

1. Gebruikersinvoer lezen

Dit is het meest voorkomende gebruik van de Scanner-klasse. We kunnen instantiëren met System.in als invoerbron en de gebruikersinvoer lezen.

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

Uitvoer:

Please enter your name
Pankaj
Hello Pankaj

Nou, het ziet er eenvoudig uit en werkt prima. Maar de bovenstaande code heeft een probleem. Zou je, zonder het volgende gedeelte te lezen, de code kunnen controleren en proberen het probleem te identificeren?

Laten we eens kijken wat er gebeurt als ik mijn volledige naam invoer.

Please enter your name
Pankaj Kumar
Hello Pankaj

Nu moet je het hebben begrepen, het gebeurt omdat spatie de scheidingsteken is. De scanner verdeelt de invoer in twee tokens – Pankaj en Kumar. Maar we roepen de next() methode slechts één keer aan, dus wordt alleen “Hallo Pankaj” afgedrukt.

Hoe lossen we dit op?

Het is eenvoudig. We kunnen het scheidingsteken wijzigen naar een nieuwe regelkarakter met de useDelimiter() methode.

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. Het Parsen van Bestandsgegevens met behulp van Scanner

Laten we eens kijken naar een eenvoudig voorbeeld om CSV-bestanden te lezen en te parsen met behulp van de scannerklasse. Laten we zeggen dat ik een employees.csv-bestand heb met de volgende inhoud.

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

Laten we het bestand lezen en een lijst met werknemers in ons Java-programma krijgen.

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 maken voor het CSV-bestand
  • // stel de delimiter in als nieuwe regel om één regel als een enkel token te lezen
  • // maak de lijst van werknemers

// sluit de scanner

// werknemersrecords afdrukken

// scanner maken voor de String-record

// stel de delimiter in als komma
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);

// sluit de scanner
sc1.useDelimiter("\\D");

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

De eerste stap is om de scanner voor het CSV-bestand te maken en een nieuwe regel als delimiter in te stellen.
sc1.close();

Vervolgens voor elke regel die werknemersrecord in CSV-indeling bevat, parseer het met behulp van een andere scanner en komma als delimiter. De parseEmployeeData() parsed elke regel en creëert een werknemerobject.

1
2
345
67
8
9
10

Tenslotte voegen we het werknemerobject toe aan de lijst en printen het.

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

3. Voorbeeld van Java Scanner Regular Expression

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