System.in în Java

Intrarea standard: textul scris de utilizator la tastatură sau trimis programului dintr-un fișier.

Sintaxă
static final InputStream in
new Scanner(System.in)
new BufferedReader(new InputStreamReader(System.in))

Ce face System.in

System.in este un InputStream, adică un flux de octeți. Direct pe el poți citi doar octeți, așa că de obicei îl „îmbraci” într-o clasă care citește text: Scanner (simplu, știe să citească numere și cuvinte) sau BufferedReader (rapid, citește rând cu rând).

Intrarea se termină când utilizatorul apasă Ctrl+D (Linux, macOS) sau Ctrl+Z (Windows), ori când se termină fișierul trimis cu java Main < date.txt. Scanner.hasNextLine() returnează atunci false, iar BufferedReader.readLine() returnează null.

Ce returnează

Un InputStream legat de intrarea standard.

Exemple

Exemplul 1: Citire cu Scanner

import java.util.Scanner;

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

Ce scrie utilizatorul (intrare)

Ana
21

Rezultat

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

Exemplul 2: Citire rând cu rând cu BufferedReader

Citim până la sfârșitul intrării și calculăm totalul cheltuielilor.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        double total = 0;
        String linie;
        while ((linie = in.readLine()) != null) {
            String[] parti = linie.split(" ");
            total += Double.parseDouble(parti[1]);
        }
        System.out.printf("Total: %.2f lei%n", total);
    }
}

Ce scrie utilizatorul (intrare)

pâine 4.50
lapte 7.20
mere 9.80

Rezultat

Total: 21.50 lei

Greșeli frecvente

  • Amesteci nextInt() cu nextLine(): după nextInt(), rândul nou rămâne în buffer, iar următorul nextLine() returnează un șir gol. Citește tot cu nextLine() și convertește cu Integer.parseInt.
  • Închizi un Scanner făcut pe System.in și apoi creezi altul: închiderea închide și System.in, iar citirile următoare eșuează. Creează un singur Scanner pentru tot programul.

Comenzi înrudite

  • System: Clasa care leagă programul de sistem: ieșirea standard (out), ieșirea de erori (err), intrarea (in), timpul, variabilele și setările.
  • Integer.parseInt: Transformă un text ca „42” în numărul întreg 42; valueOf face același lucru, dar returnează un obiect Integer.
  • Double.parseDouble: Double este wrapperul pentru double; parseDouble și valueOf transformă un text ca „3.75” în număr cu zecimale.
  • String.split: Împarte șirul în bucăți după un separator (expresie regulată) și returnează un array de String.