Retour au cours

Flux d'entrée et de sortie (Flux d'octets vs Flux de caractères)

Maîtrise de Java : De Zéro à Développeur Professionnel (Un parcours en 50 leçons)

Leçon 44 : Flux d'entrée et de sortie

L'I/O de Java est basé sur le concept de flux (streams), qui représentent une séquence de données circulant d'une source (Input Stream) vers une destination (Output Stream).

1. Flux d'octets (Byte Streams)

  • Gèrent les données binaires brutes (ex: images, sons, objets sérialisés).
  • Classes de base : InputStream (lecture) et OutputStream (écriture).
  • Classes concrètes : FileInputStream, FileOutputStream.

java // Exemple : Copie de données octet par octet (inefficace, pour illustration) try (InputStream input = new FileInputStream("source.dat"); OutputStream output = new FileOutputStream("target.dat")) {

int data; 
while ((data = input.read()) != -1) { // Lit un octet
    output.write(data);
}

} catch (IOException e) { // Gérer l'exception }

2. Flux de caractères (Character Streams)

  • Gèrent les données textuelles (caractères), en utilisant un encodage comme UTF-8 ou ASCII.
  • Classes de base : Reader (lecture) et Writer (écriture).
  • Classes concrètes : FileReader, FileWriter.

java // Exemple : Lecture de texte try (Reader reader = new FileReader("config.txt")) { int charCode; while ((charCode = reader.read()) != -1) { System.out.print((char) charCode); } } catch (IOException e) { /* ... */ }

3. Flux mis en mémoire tampon (Buffered Streams) et patron de conception Decorator

Pour améliorer les performances, les flux sont souvent enveloppés dans des flux mis en mémoire tampon. La mise en mémoire tampon lit de gros blocs de données du disque en une seule fois, réduisant ainsi les opérations d'I/O.

  • BufferedReader/BufferedWriter (Caractère)
  • BufferedInputStream/BufferedOutputStream (Octet)

java // Utilisation d'un BufferedReader pour lire efficacement des lignes de texte try (BufferedReader br = new BufferedReader(new FileReader("large.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { /* ... */ }

Try-with-Resources (Crucial) : Remarquez l'utilisation de la syntaxe try ( ... ). Cela garantit que les flux sont automatiquement et sûrement fermés, même si une exception se produit.