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()cabyteși verifici-1după conversie: octetul 255 devine și el-1. Păstrează rezultatul înint.
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ă.