Scanner în Java

Citește text și numere de la tastatură, dintr-un String sau dintr-un fișier, bucată cu bucată; close îl închide.

Sintaxă
import java.util.Scanner;

Scanner sc = new Scanner(System.in);
Scanner sc = new Scanner(String text);
Scanner sc = new Scanner(Path fisier);
void close()

Ce face Scanner

Scanner împarte intrarea în bucăți (tokeni, separați implicit prin spații și rânduri noi) și le transformă în tipul cerut: nextInt() pentru numere întregi, nextDouble() pentru numere cu virgulă, next() pentru un cuvânt, nextLine() pentru tot rândul.

Cel mai des se creează cu new Scanner(System.in), ca să citești ce scrie utilizatorul. Poate citi și dintr-un String sau dintr-un fișier (new Scanner(Path.of("date.txt")), care aruncă IOException).

close() eliberează sursa. Atenție: închiderea unui Scanner făcut pe System.in închide și System.in, iar după aceea nu mai poți citi de la tastatură în tot programul. De aceea, de obicei se creează un singur Scanner pentru tastatură, la începutul lui main.

Ce returnează

Un obiect Scanner. close() nu returnează nimic.

Exemple

Exemplul 1: Nume și vârstă de la tastatură

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Cum te numești? ");
        String nume = sc.nextLine();
        System.out.print("Câți ani ai? ");
        int varsta = sc.nextInt();
        System.out.println();
        System.out.println("Salut, " + nume + "! Peste 10 ani vei avea " + (varsta + 10) + " ani.");
        sc.close();
    }
}

Ce scrie utilizatorul (intrare)

Ana Popescu
21

Rezultat

Cum te numești? Câți ani ai? 
Salut, Ana Popescu! Peste 10 ani vei avea 31 ani.

Exemplul 2: Scanner pe un text și pe un fișier, cu try-with-resources

Pentru surse care nu sunt tastatura, try-with-resources închide scanner-ul automat.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        try (Scanner sc = new Scanner("12 7 30 5")) {
            int suma = 0;
            while (sc.hasNextInt()) {
                suma += sc.nextInt();
            }
            System.out.println("Suma: " + suma);
        }

        Path fisier = Files.writeString(Path.of("orase.txt"), "Iași\nCluj\nBrașov\n");
        try (Scanner sc = new Scanner(fisier)) {
            while (sc.hasNextLine()) {
                System.out.println("Oraș: " + sc.nextLine());
            }
        }
    }
}

Rezultat

Suma: 54
Oraș: Iași
Oraș: Cluj
Oraș: Brașov

Greșeli frecvente

  • Creezi un Scanner nou pe System.in în fiecare metodă și îl închizi: după primul close, citirea dă NoSuchElementException.
  • Amesteci nextInt() cu nextLine(): după număr rămâne sfârșitul de rând, iar nextLine() returnează un text gol. Vezi pagina Scanner.nextLine.
  • Citești numere zecimale fără să te gândești la limbă: în setările românești nextDouble așteaptă 7,5, nu 7.5.

Comenzi înrudite

  • Scanner.nextLine: Citește tot restul rândului curent (cu spații cu tot) și returnează textul fără sfârșitul de rând.
  • Scanner.nextInt: Citește următorul număr întreg (nextInt) sau zecimal (nextDouble); dă eroare dacă textul nu este un număr.
  • Scanner.hasNextLine: Verifică fără să citească: hasNextLine dacă mai există un rând, hasNextInt dacă următorul token este un număr întreg.
  • BufferedReader: Citește text eficient, rând cu rând, dintr-un fișier, de la tastatură sau din alt Reader; close închide sursa.