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 dossierFiles: 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
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.
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));
}
}
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
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.
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.
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.
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.