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
Scannernou peSystem.inîn fiecare metodă și îl închizi: după primulclose, citirea dăNoSuchElementException. - Amesteci
nextInt()cunextLine(): după număr rămâne sfârșitul de rând, iarnextLine()returnează un text gol. Vezi paginaScanner.nextLine. - Citești numere zecimale fără să te gândești la limbă: în setările românești
nextDoubleașteaptă7,5, nu7.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.