InputStream în Java

Citire și scriere pe fluxuri (java.io) Java 1.0 (readAllBytes: Java 9)

Clasa de bază pentru citirea de octeți (fișiere, rețea, System.in); readAllBytes citește tot conținutul într-un byte[].

Sintaxă
import java.io.InputStream;

public abstract class InputStream implements Closeable
abstract int read() throws IOException
byte[] readAllBytes() throws IOException

Ce face InputStream

InputStream este o sursă de octeți, nu de caractere: fișiere (Files.newInputStream, FileInputStream), date din memorie (ByteArrayInputStream), răspunsuri din rețea sau System.in. Pentru text îl învelești într-un InputStreamReader cu o codare.

read() citește un singur octet (0–255) și returnează -1 la sfârșit. readAllBytes() citește tot ce a rămas și returnează un byte[]; e comod pentru fișiere mici sau răspunsuri scurte. Pentru text, transformi octeții cu new String(octeti, StandardCharsets.UTF_8).

Fluxurile trebuie închise: folosește try-with-resources. Pentru copierea într-un alt flux există transferTo(OutputStream).

Ce returnează

read: un octet sau -1. readAllBytes: un byte[] (gol la sfârșit).

Exemple

Exemplul 1: readAllBytes dintr-un fișier

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

public class Main {
    public static void main(String[] args) throws IOException {
        Path cale = Files.writeString(Path.of("mesaj.txt"), "Știri din Brașov");

        try (InputStream in = Files.newInputStream(cale)) {
            byte[] octeti = in.readAllBytes();
            System.out.println("Octeți: " + octeti.length);
            System.out.println("Text: " + new String(octeti, StandardCharsets.UTF_8));
            System.out.println("Mai e ceva? " + in.readAllBytes().length);
        }
    }
}

Rezultat

Octeți: 18
Text: Știri din Brașov
Mai e ceva? 0

Exemplul 2: read(), octet cu octet

Litera „ș” ocupă doi octeți în UTF-8 (200 și 153), de aceea textul de 3 litere are 4 octeți.

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws IOException {
        InputStream in = new ByteArrayInputStream("aș!".getBytes(StandardCharsets.UTF_8));
        int b;
        while ((b = in.read()) != -1) {
            System.out.print(b + " ");
        }
        System.out.println();
        in.close();
    }
}

Rezultat

97 200 153 33

Exemplul 3: Tot textul de la intrarea standard

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws IOException {
        String text = new String(System.in.readAllBytes(), StandardCharsets.UTF_8);
        System.out.println("Am primit " + text.lines().count() + " rânduri:");
        System.out.print(text.toUpperCase());
    }
}

Ce scrie utilizatorul (intrare)

mere
pere

Rezultat

Am primit 2 rânduri:
MERE
PERE

Greșeli frecvente

  • Faci new String(octeti) fără codare: diacriticele pot ieși greșit pe unele sisteme. Dă StandardCharsets.UTF_8.
  • Folosești readAllBytes() pe un fișier uriaș: tot conținutul ajunge în memorie.
  • Tratezi valoarea lui read() ca byte și verifici -1 după conversie: octetul 255 devine și el -1. Păstrează rezultatul în int.

Comenzi înrudite

  • Files.copy: Copiază un fișier în altă locație; cu StandardCopyOption.REPLACE_EXISTING suprascrie destinația dacă există.
  • StandardCharsets: Constante pentru codările de text garantate în orice Java; UTF_8 este codarea potrivită pentru diacriticele românești.
  • BufferedReader: Citește text eficient, rând cu rând, dintr-un fișier, de la tastatură sau din alt Reader; close închide sursa.
  • IOException: Excepția verificată pentru erori de intrare/ieșire (fișier lipsă, fără drepturi, disc plin); trebuie prinsă sau declarată.