# Java - I/O Streams: A Beginner's Guide

Java - I/O Streams

Bonjour à tous, aspirants programmeurs Java !aujourd'hui, nous allons embarquer pour un voyage passionnant dans le monde des flux I/O Java. Ne vous inquiétez pas si vous êtes complètement nouveau dans la programmation – je serai votre guide aimable et nous allons procéder pas à pas. À la fin de ce tutoriel, vous manipulerez des fichiers et des flux comme un pro !

## Qu'est-ce qu'un flux I/O ?

Avant de plonger dans les détails, voyons ce qu'entend par un flux I/O. En Java, un flux est une séquence de données. Le terme "I/O" signifie Input/Output, ou en français, Entrée/Sortie. Ainsi, les flux I/O sont le moyen dont Java gère la lecture et l'écriture dans diverses sources, comme des fichiers, des connexions réseau ou même la console.

Pensez à un flux comme une rivière de données. Vous pouvez soit :

  1. Prendre l'eau (données) de la rivière (flux d'entrée)
  2. Mettre de l'eau (données) dans la rivière (flux de sortie)

## Flux standard

Java fournit trois flux standard déjà configurés pour nous :

  1. System.in (Flux d'entrée)
  2. System.out (Flux de sortie)
  3. System.err (Flux d'erreur de sortie)

Commençons par un exemple simple :

import java.util.Scanner;

public class HelloStream {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Quel est votre nom ? ");
        String name = scanner.nextLine();
        System.out.println("Bonjour, " + name + " !");
        scanner.close();
    }
}

Dans cet exemple, nous utilisons System.in pour lire l'entrée de l'utilisateur et System.out pour afficher la sortie. La classe Scanner nous aide à lire depuis le flux d'entrée facilement.

## Lecture et écriture de fichiers

Maintenant, passons à quelque chose de plus passionnant – travailler avec des fichiers !

### Lecture d'un fichier

Voici comment vous pouvez lire un fichier :

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderExample {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.err.println("Une erreur s'est produite : " + e.getMessage());
        }
    }
}

Ce code lit un fichier nommé "example.txt" ligne par ligne et imprime chaque ligne sur la console. L'instruction try-with-resources garantit que le fichier est correctement fermé après lecture.

### Écriture dans un fichier

Écrire dans un fichier est tout aussi facile :

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
            writer.write("Bonjour, I/O de fichier !");
            writer.newLine();
            writer.write("C'est une nouvelle ligne.");
        } catch (IOException e) {
            System.err.println("Une erreur s'est produite : " + e.getMessage());
        }
    }
}

Ce code crée un nouveau fichier appelé "output.txt" et écrit deux lignes dedans.

## FileOutputStream

Parfois, vous pouvez avoir besoin d'écrire des données binaires dans un fichier. C'est là que FileOutputStream est utile :

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("binary.dat")) {
            byte[] data = {65, 66, 67, 68, 69}; // Valeurs ASCII pour A, B, C, D, E
            fos.write(data);
        } catch (IOException e) {
            System.err.println("Une erreur s'est produite : " + e.getMessage());
        }
    }
}

Cet exemple écrit des données binaires dans un fichier nommé "binary.dat".

## Navigation de fichiers et I/O

Java fournit la classe File pour travailler avec les chemins de fichiers et de répertoires. Voici un exemple :

import java.io.File;

public class FileNavigationExample {
    public static void main(String[] args) {
        File file = new File("example.txt");
        System.out.println("Le fichier existe : " + file.exists());
        System.out.println("Nom du fichier : " + file.getName());
        System.out.println("Chemin absolu : " + file.getAbsolutePath());
    }
}

Ce code montre comment obtenir des informations sur un fichier en utilisant la classe File.

## Répertoires en Java

Travailler avec des répertoires est similaire à travailler avec des fichiers. Voyons comment créer un répertoire :

import java.io.File;

public class DirectoryExample {
    public static void main(String[] args) {
        File dir = new File("newDirectory");
        if (dir.mkdir()) {
            System.out.println("Répertoire créé avec succès !");
        } else {
            System.out.println("Échec de la création du répertoire.");
        }
    }
}

Ce code crée un nouveau répertoire appelé "newDirectory" dans le répertoire de travail actuel.

## Liste des répertoires

Enfin, voyons comment lister le contenu d'un répertoire :

import java.io.File;

public class ListDirectoryExample {
    public static void main(String[] args) {
        File dir = new File(".");
        String[] fileList = dir.list();
        if (fileList != null) {
            for (String fileName : fileList) {
                System.out.println(fileName);
            }
        } else {
            System.out.println("Soit le répertoire n'existe pas, soit ce n'est pas un répertoire.");
        }
    }
}

Ce code liste tous les fichiers et répertoires dans le répertoire de travail actuel.

## Conclusion

Félicitations ! Vous avez juste pris vos premiers pas dans le monde des flux I/O Java. Nous avons couvert beaucoup de terrain, de la base de la lecture/écriture aux manipulations de fichiers et aux opérations de répertoire. Souvenez-vous, la pratique fait le maître, alors n'hésitez pas à expérimenter avec ces concepts.

Voici un tableau de référence rapide des méthodes que nous avons utilisées :

Méthode Description
Scanner.nextLine() Lit une ligne de texte de l'entrée
BufferedReader.readLine() Lit une ligne de texte d'un fichier
BufferedWriter.write() Écrit une chaîne dans un fichier
BufferedWriter.newLine() Écrit un séparateur de ligne dans un fichier
FileOutputStream.write() Écrit des octets dans un fichier
File.exists() Vérifie si un fichier existe
File.getName() Obtient le nom d'un fichier
File.getAbsolutePath() Obtient le chemin absolu d'un fichier
File.mkdir() Crée un répertoire
File.list() Liste le contenu d'un répertoire

Continuez à coder, à apprendre, et surtout, amusez-vous ! N'oubliez pas que chaque expert était autrefois un débutant. Bon codage !

Credits: Image by storyset