System în Java

Clasa care leagă programul de sistem: ieșirea standard (out), ieșirea de erori (err), intrarea (in), timpul, variabilele și setările.

Sintaxă
public final class System
static final PrintStream out
static final PrintStream err
static final InputStream in

Ce face System

System nu poate fi instanțiată; folosești direct câmpurile și metodele ei statice. Cele mai cunoscute sunt cele trei fluxuri standard: System.out pentru rezultate, System.err pentru mesaje de eroare și System.in pentru citirea de la tastatură.

System.out și System.err sunt obiecte PrintStream, cu metodele println (scrie și trece la rând nou), print (fără rând nou) și printf (cu format, ca String.format). Ambele apar implicit în terminal, dar sunt fluxuri separate: în linia de comandă poți trimite rezultatele într-un fișier (java Main > rezultat.txt) și să vezi în continuare erorile pe ecran. Din acest motiv, ordinea în care apar textele din out și err nu este garantată.

Tot aici găsești timpul (currentTimeMillis, nanoTime), oprirea programului (exit), variabilele de mediu (getenv), proprietățile (getProperty) și copierea rapidă de array-uri (arraycopy).

Ce returnează

Câmpurile out și err sunt PrintStream; in este InputStream.

Exemple

Exemplul 1: println, print și printf

public class Main {
    public static void main(String[] args) {
        System.out.println("Raport pentru Ana");
        System.out.print("Note: ");
        System.out.print(9);
        System.out.print(", ");
        System.out.println(10);
        System.out.printf("Media: %.2f, oraș: %s%n", 9.5, "Iași");
    }
}

Rezultat

Raport pentru Ana
Note: 9, 10
Media: 9.50, oraș: Iași

Exemplul 2: Rezultate pe out, erori pe err

Liniile cu probleme merg pe System.err. Aici le scriem la final, pentru că ordinea dintre cele două fluxuri nu este garantată.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String[] linii = {"Ana;9", "Ion;x", "Maria;10", "Radu"};
        List<String> erori = new ArrayList<>();
        for (String linie : linii) {
            String[] parti = linie.split(";");
            if (parti.length == 2 && parti[1].matches("\\d+")) {
                System.out.println(parti[0] + " are nota " + parti[1]);
            } else {
                erori.add(linie);
            }
        }
        for (String e : erori) {
            System.err.println("Linie invalidă: " + e);
        }
    }
}

Rezultat

Ana are nota 9
Maria are nota 10
Linie invalidă: Ion;x
Linie invalidă: Radu

Greșeli frecvente

  • Scrii mesajele de eroare pe System.out: când rezultatul este redirecționat într-un fișier, erorile ajung amestecate cu datele.
  • Te bazezi pe ordinea dintre System.out și System.err în terminal: fluxurile au buffere separate și pot apărea în altă ordine.
  • Folosești \n în printf: merge, dar %n pune separatorul de rând potrivit sistemului.

Comenzi înrudite

  • System.in: Intrarea standard: textul scris de utilizator la tastatură sau trimis programului dintr-un fișier.
  • System.exit: Oprește imediat programul (JVM-ul) cu un cod de ieșire: 0 înseamnă succes, altă valoare înseamnă eroare.
  • String.format: Construiește un șir dintr-un șablon cu %s, %d, %.2f etc.; formatted() face același lucru pe șablon.
  • System.getProperty: Citește proprietățile JVM-ului (versiunea Java, sistemul de operare, directorul curent); lineSeparator() dă separatorul de rând.