Aller au contenu principal

Gestion de fichiers

Notions théoriques

L'API moderne : java.nio.file

Depuis Java 7, Java propose une API moderne pour manipuler les fichiers : le package java.nio.file. Elle est plus simple et plus robuste que l'ancienne API java.io.File.

Les deux classes principales sont :

  • Path : représente un chemin vers un fichier ou un dossier
  • Files : fournit des méthodes statiques pour lire, écrire, copier, supprimer des fichiers
import java.nio.file.Files;
import java.nio.file.Path;

Créer un chemin avec Path.of()

Path chemin = Path.of("mon_fichier.txt"); // relatif au dossier courant
Path absolu = Path.of("/home/user/documents/f.txt"); // chemin absolu
Path compose = Path.of("data", "eleves.csv"); // data/eleves.csv

Lire un fichier

Lire tout le contenu en une seule String :

String contenu = Files.readString(chemin);

Lire toutes les lignes dans une liste :

import java.util.List;

List<String> lignes = Files.readAllLines(chemin);
for (String ligne : lignes) {
System.out.println(ligne);
}

Écrire dans un fichier

Écrire une String (écrase le fichier existant) :

Files.writeString(chemin, "Bonjour !\nDeuxième ligne.\n");

Ajouter à la fin d'un fichier existant :

import java.nio.file.StandardOpenOption;

Files.writeString(chemin, "Nouvelle ligne\n", StandardOpenOption.APPEND);

Vérifier l'existence d'un fichier

if (Files.exists(chemin)) {
System.out.println("Le fichier existe.");
} else {
System.out.println("Fichier introuvable.");
}

BufferedReader / BufferedWriter — Pour les gros fichiers

Pour les fichiers volumineux, utilise BufferedReader et BufferedWriter qui lisent/écrivent par blocs (plus efficace) :

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

try-with-resources — Fermeture automatique

Les fichiers sont des ressources qui doivent être fermées après utilisation. Java fournit la syntaxe try-with-resources qui ferme automatiquement la ressource à la fin du bloc, même en cas d'exception :

Path chemin = Path.of("fichier.txt");

try (BufferedReader reader = new BufferedReader(new FileReader(chemin.toFile()))) {
String ligne;
while ((ligne = reader.readLine()) != null) {
System.out.println(ligne);
}
} catch (Exception e) {
System.out.println("Erreur : " + e.getMessage());
}
// reader est automatiquement fermé ici
try-with-resources vs try classique

Sans try-with-resources, il faut fermer manuellement avec reader.close() dans un bloc finally. Le try-with-resources est plus sûr car la fermeture a toujours lieu, même si une exception est levée.

Exceptions de fichiers

Les opérations sur les fichiers peuvent lever des exceptions (IOException). Il faut toujours les gérer avec try/catch.

Exemple pratique

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class GestionFichiers {

public static void main(String[] args) {
Path chemin = Path.of("notes.txt");

// Écrire dans un fichier
try {
String contenu = "Alice;15.5\nBob;12.0\nCharlie;17.5\n";
Files.writeString(chemin, contenu);
System.out.println("Fichier écrit.");
} catch (Exception e) {
System.out.println("Erreur écriture : " + e.getMessage());
}

// Lire toutes les lignes
try {
List<String> lignes = Files.readAllLines(chemin);
System.out.println("Contenu du fichier :");
for (String ligne : lignes) {
System.out.println(" " + ligne);
}
} catch (Exception e) {
System.out.println("Erreur lecture : " + e.getMessage());
}

// Vérifier l'existence
System.out.println("Fichier existe ? " + Files.exists(chemin));
}
}
astuce

Utilisez des chemins relatifs (Path.of("fichier.txt")) pendant le développement. Le fichier est créé dans le dossier depuis lequel vous lancez le programme (dans IntelliJ, c'est la racine du projet).

Test de mémorisation/compréhension


Quel package Java moderne utilise-t-on pour gérer les fichiers ?


Quelle méthode lit tout le contenu d'un fichier en une seule String ?


Que fait la syntaxe try-with-resources ?


Quelle méthode vérifie si un fichier existe ?


Pour AJOUTER du texte à la fin d'un fichier avec Files.writeString(), quelle option faut-il passer ?


Quelle méthode de Files lit toutes les lignes dans une List<String> ?


TP pour réfléchir et résoudre des problèmes

Vous allez créer un programme qui lit un fichier CSV d'élèves et affiche leurs informations formatées.

Le fichier eleves.csv aura ce format :

Alice;15.5;SLAM
Bob;12.0;SISR
Charlie;17.5;SLAM
Diana;9.5;SISR

Étape 1 — Créer le fichier CSV

Utilise Files.writeString() pour créer le fichier eleves.csv avec des données d'exemple.


Bonne pratique - Toujours gérer les exceptions fichier

Les opérations fichier peuvent échouer : droits insuffisants, disque plein, chemin inexistant. Entoure toujours les opérations fichier d'un try/catch et affiche un message d'erreur utile.

Étape 2 — Lire et parser le CSV

Lis toutes les lignes du fichier et pour chaque ligne, utilise split(";") pour extraire les champs.


Bonne pratique - Parser les types après split

Après un split(), tous les éléments sont des String. Convertis-les dans le bon type immédiatement : Double.parseDouble(champs[1]) pour un double, Integer.parseInt(champs[0]) pour un int. Cela rend le code plus sûr et lisible.

Étape 3 — Afficher le tableau formaté

Affiche les données dans un tableau aligné avec System.out.printf.


Bonne pratique - Afficher un en-tête de tableau

Avant d'afficher les données, affiche un en-tête avec les noms de colonnes, en utilisant le même format printf. Cela rend la sortie immédiatement lisible, surtout quand les données viennent d'un fichier.

📌 Une solution