PrintStream în Java

Fluxul de ieșire cu print, println și printf; System.out este un PrintStream. Poate scrie și în fișiere.

Sintaxă
import java.io.PrintStream;

new PrintStream(String numeFisier, Charset codare) throws FileNotFoundException
new PrintStream(OutputStream iesire, boolean autoFlush, Charset codare)

Ce face PrintStream

PrintStream transformă orice valoare (numere, texte, obiecte) în text și o scrie într-un flux de octeți. System.out (ecranul) și System.err (mesajele de eroare) sunt obiecte PrintStream; de aceea scrii System.out.println(...).

Poți crea propriul PrintStream către un fișier: new PrintStream("raport.txt", StandardCharsets.UTF_8), și folosești aceleași metode ca pentru ecran. Spre deosebire de alte fluxuri, metodele lui nu aruncă IOException; erorile se verifică cu checkError().

Cu System.setOut(...) poți redirecționa tot ce afișează programul, de exemplu către un fișier sau către memorie în teste.

Parametri

Parametru Descriere
numeFisier / iesire Fișierul sau fluxul în care se scrie.
autoFlush Dacă true, golește buffer-ul la fiecare println.
codare Setul de caractere, de exemplu StandardCharsets.UTF_8.

Ce returnează

Un obiect PrintStream.

Exemple

Exemplul 1: Același cod scrie pe ecran sau în fișier

import java.io.IOException;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class Main {
    static void bon(PrintStream out) {
        out.println("Bon fiscal - Magazinul La Colț");
        out.printf("%-10s %6.2f lei%n", "pâine", 4.50);
        out.printf("%-10s %6.2f lei%n", "lapte", 7.90);
    }

    public static void main(String[] args) throws IOException {
        bon(System.out);

        try (PrintStream fisier = new PrintStream("bon.txt", StandardCharsets.UTF_8)) {
            bon(fisier);
        }
        System.out.println("În fișier: " + Files.readAllLines(Path.of("bon.txt")).size() + " rânduri");
    }
}

Rezultat

Bon fiscal - Magazinul La Colț
pâine        4.50 lei
lapte        7.90 lei
În fișier: 3 rânduri

Exemplul 2: Captarea afișărilor în memorie

Redirecționăm System.out către un ByteArrayOutputStream, apelăm o metodă care afișează, apoi refacem ieșirea normală.

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

public class Main {
    static void saluta(String nume) {
        System.out.println("Bună, " + nume + "!");
    }

    public static void main(String[] args) {
        PrintStream original = System.out;
        ByteArrayOutputStream memorie = new ByteArrayOutputStream();
        System.setOut(new PrintStream(memorie, true, StandardCharsets.UTF_8));

        saluta("Ioana");

        System.setOut(original);
        String captat = memorie.toString(StandardCharsets.UTF_8);
        System.out.println("Am captat: " + captat.strip() + " (" + captat.length() + " caractere)");
    }
}

Rezultat

Am captat: Bună, Ioana! (13 caractere)

Greșeli frecvente

  • Creezi new PrintStream("x.txt") fără codare: textul se scrie cu codarea implicită a sistemului. Dă explicit StandardCharsets.UTF_8.
  • Aștepți o excepție când scrierea eșuează (disc plin). PrintStream nu aruncă; verifică checkError().
  • Închizi System.out (de exemplu cu try (PrintStream p = System.out)): după aceea nu mai apare nimic pe ecran.

Comenzi înrudite

  • PrintStream.println: println afișează o valoare și trece la rând nou; print o afișează și rămâne pe același rând.
  • PrintStream.printf: Afișează text formatat după un șablon cu %s, %d, %.2f, %n: numere cu zecimale fixe, coloane aliniate.
  • BufferedWriter: Scrie text eficient, adunându-l în memorie și trimițându-l în bucăți mari; write scrie text, newLine un sfârșit de rând.
  • Files.writeString: Scrie un text într-un fișier (UTF-8): îl creează sau îl suprascrie; cu StandardOpenOption.APPEND adaugă la final.