HOWTO · Java

Écrire un octet dans un fichier en Java

Cet article montre comment écrire un octet dans un fichier en Java

Sur cette page

Ce tutoriel montre comment écrire un tableau d’octets dans un fichier en Java. La bibliothèque standard Java offre deux options pratiques : FileOutputStream pour les écritures sous forme de flux et la méthode NIO Files.write() pour une opération en un seul appel ; Apache Commons IO ajoute FileUtils.writeByteArrayToFile() pour les projets qui utilisent déjà cette dépendance. Chaque exemple convertit le texte en octets avec StandardCharsets.UTF_8, afin que le fichier produit ne dépende pas du jeu de caractères par défaut de la machine.

Écrire un tableau d’octets avec FileOutputStream

FileOutputStream est le flux orienté octets classique de java.io. Instancié avec un nom de fichier, il crée le fichier s’il est absent et remplace le contenu d’un fichier déjà présent ; passez true comme second argument au constructeur pour ajouter des données à la place. Le flux détient un descripteur de fichier du système d’exploitation : fermez-le donc lorsque l’écriture est terminée ; le bloc try-with-resources effectue cette fermeture automatiquement.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;

class ByteToFile {
  public static void main(String[] args) throws Throwable {
    byte[] data = "DelftStack writes bytes".getBytes(StandardCharsets.UTF_8);
    try (FileOutputStream out = new FileOutputStream("stream-demo.bin")) {
      out.write(data);
    }
    System.out.println("Wrote " + data.length + " bytes to stream-demo.bin");
  }
}
Wrote 23 bytes to stream-demo.bin

getBytes(StandardCharsets.UTF_8) encode la chaîne de façon déterministe ; appeler getBytes() sans argument utilise le jeu de caractères par défaut de la plateforme et pourrait produire des octets différents sur une autre machine. write(data) enregistre tout le tableau, tandis que write(data, offset, length) n’enregistre qu’une tranche lorsque vous en avez besoin. Lorsque le constructeur lui-même échoue — chemin désignant un répertoire, répertoire parent inexistant ou droit d’écriture manquant — Java lève une FileNotFoundException ; choisissez donc une destination accessible en écriture avant d’ouvrir le flux.

Écrire un tableau d’octets avec Files.write()

L’API java.nio.file ramène toute l’opération à un seul appel. Files.write() ouvre le chemin, écrit chaque octet et ferme le fichier ; par défaut, elle crée le fichier s’il est absent et le tronque s’il est présent. Passez des options d’ouverture comme StandardOpenOption.APPEND pour ajouter des données ou StandardOpenOption.CREATE_NEW pour échouer si le fichier existe déjà.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

class ByteToFileNio {
  public static void main(String[] args) throws Throwable {
    byte[] data = "NIO write sample data".getBytes(StandardCharsets.UTF_8);
    Path target = Paths.get("nio-demo.bin");
    Files.write(target, data);
    System.out.println("Wrote " + data.length + " bytes to nio-demo.bin");
  }
}
Wrote 21 bytes to nio-demo.bin

La méthode déclare IOException, et ses échecs courants sont explicites : NoSuchFileException lorsqu’un répertoire parent est absent, AccessDeniedException lorsque le processus ne dispose pas des droits nécessaires, et FileAlreadyExistsException lorsque vous passez CREATE_NEW pour un fichier existant. Choisissez Files.write() lorsque vous voulez la forme la plus courte de la bibliothèque standard et que vous n’avez pas besoin du contrôle d’un flux ouvert offert par FileOutputStream.

Écrire un tableau d’octets avec Apache Commons IO

Les projets qui dépendent déjà d’Apache Commons IO peuvent appeler FileUtils.writeByteArrayToFile() à la place. Déclarez les coordonnées Maven commons-io:commons-io avec la version épinglée par votre build ; la version d’origine de cet article indiquait 2.6, qui est une version fournie à titre d’exemple plutôt qu’une recommandation actuelle. Vérifiez donc la ligne de versions que vous comptez utiliser.

Avec org.apache.commons.io.FileUtils importé, l’appel est FileUtils.writeByteArrayToFile(new File("doc.txt"), data), où data est un byte[] quelconque tel que "text".getBytes(StandardCharsets.UTF_8). La méthode crée le fichier de destination s’il est absent, crée au passage les répertoires parents manquants — une étape que Files.write() n’effectue pas — et tronque un fichier existant avant l’écriture. Elle gère également le flux en interne, de sorte qu’aucun descripteur n’est laissé à fermer par l’appelant. Comme cette classe réside dans un JAR tiers, cet extrait est présenté comme du code source et non comme un exemple exécutable ; pour du nouveau code sans cette dépendance, Files.write() réalise la même tâche en une ligne.