Comment créer un fichier et y écrire en Java

Il existe plusieurs façons de créer un fichier et d'y écrire en Java. Depuis Java 7 et la classe Files, la syntaxe est devenue concise et fiable. Voici les trois approches que vous rencontrerez, de la plus simple à la plus flexible.

Méthode 1 — Files.writeString (la plus simple)

Depuis Java 11, une seule ligne écrit une chaîne entière dans un fichier, en créant le fichier s'il n'existe pas :

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

Files.writeString(
    Path.of("sortie.txt"),
    "Bonjour le monde !\nDeuxième ligne."
);

Variante pour écrire plusieurs lignes :

import java.util.List;

Files.write(Path.of("notes.txt"), List.of("ligne 1", "ligne 2", "ligne 3"));

L'encodage par défaut est UTF-8. Pour forcer un autre encodage :

import java.nio.charset.StandardCharsets;

Files.writeString(Path.of("fichier.txt"), "contenu", StandardCharsets.ISO_8859_1);

Par défaut, le fichier est écrasé s'il existe. Pour ajouter à la fin (append) :

import java.nio.file.StandardOpenOption;

Files.writeString(
    Path.of("log.txt"),
    "nouvelle ligne\n",
    StandardOpenOption.CREATE,
    StandardOpenOption.APPEND
);

Méthode 2 — BufferedWriter pour des écritures progressives

Quand le contenu est généré en plusieurs étapes, utilisez un BufferedWriter avec try-with-resources :

import java.io.BufferedWriter;
import java.nio.file.Files;
import java.nio.file.Path;

try (BufferedWriter w = Files.newBufferedWriter(Path.of("sortie.txt"))) {
    w.write("Titre\n");
    w.newLine();
    for (int i = 1; i <= 10; i++) {
        w.write("Ligne " + i);
        w.newLine();
    }
}

Le BufferedWriter accumule les caractères en mémoire avant d'écrire par paquets sur le disque — beaucoup plus rapide que des appels write() caractère par caractère.

Méthode 3 — PrintWriter pour du texte formaté

PrintWriter offre println(), printf() et ne lance pas IOException pour les opérations d'écriture (il expose un statut via checkError()) :

import java.io.PrintWriter;

try (PrintWriter p = new PrintWriter(Files.newBufferedWriter(Path.of("rapport.txt")))) {
    p.println("Rapport quotidien");
    p.printf("Total : %,d transactions%n", 1542);
    p.printf("Montant : %.2f €%n", 15342.75);
}

Écrire des bytes bruts

Pour des données binaires, utilisez Files.write avec un byte[] :

byte[] data = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
Files.write(Path.of("binaire.dat"), data);

Ou un OutputStream pour du streaming :

try (java.io.OutputStream out = Files.newOutputStream(Path.of("image.png"))) {
    out.write(bytesDepuisQuelquePart);
}

Créer un fichier sans y écrire

Si vous voulez simplement créer un fichier vide :

Files.createFile(Path.of("nouveau.txt"));

Lance FileAlreadyExistsException si le fichier existe déjà — utile pour des fichiers de lock ou sentinel.

Créer les dossiers parents si besoin

Path p = Path.of("rapports/2026/04/journal.txt");
Files.createDirectories(p.getParent());
Files.writeString(p, "Contenu");
createDirectories ne lève pas d'exception si les dossiers existent déjà, contrairement à createDirectory.

Gestion des erreurs

Toutes ces méthodes lèvent IOException si le disque est plein, si les permissions sont insuffisantes, si le chemin est invalide :

try {
    Files.writeString(Path.of("/etc/system.conf"), "…");
} catch (java.nio.file.AccessDeniedException e) {
    System.err.println("Permission refusée : " + e.getFile());
} catch (IOException e) {
    System.err.println("Erreur I/O : " + e.getMessage());
}

Les anciennes APIs à éviter

Vous croiserez encore dans du vieux code :

// ❌ Verbeux, pas d'UTF-8 garanti, ressources à fermer manuellement
FileWriter fw = new FileWriter("sortie.txt");
fw.write("contenu");
fw.close();

// ❌ Pas de gestion d'exception claire
new PrintWriter("sortie.txt").write("contenu"); // ressource jamais fermée

Pour tout nouveau code, restez sur l'API java.nio.file.Files + try-with-resources.

Récapitulatif

CasMéthode recommandée
Écrire tout d'un coupFiles.writeString
Écrire ligne par ligneFiles.newBufferedWriter + try-with-resources
Texte formatéPrintWriter via Files.newBufferedWriter
Données binairesFiles.write(path, byte[]) ou newOutputStream
Ajouter à la finStandardOpenOption.APPEND
Créer les dossiers manquantsFiles.createDirectories

Avec ces cinq ou six patrons, vous couvrez 99 % des cas d'écriture de fichiers en Java — de façon concise, thread-safe et avec une gestion d'erreurs propre.