Système de fichiers et flux en Node.js
Module fs pour lire et écrire des fichiers, et streams pour traiter efficacement de grandes quantités de données de manière asynchrone.
Le module fs (File System) permet de lire et écrire des fichiers, tandis que les flux (streams) permettent de traiter efficacement de grandes quantités de données de manière asynchrone.
📂 Lire et écrire des fichiers
Le module fs de Node.js fournit une interface pour interagir avec le système de fichiers : lire, écrire, supprimer et manipuler des fichiers.
📖 Lecture d'un fichier
import { readFile } from "node:fs/promises"
try {
const data = await readFile("exemple.txt", "utf8")
console.log("Contenu du fichier :", data)
} catch (err) {
console.error("Erreur lors de la lecture :", err)
}Avec readFile de node:fs/promises, on utilise directement await — pas de callback. Le type retourné est Promise<string> quand l'encodage est "utf8".
✍️ Écriture dans un fichier
import { writeFile } from "node:fs/promises"
const contenu = "Ceci est un exemple de texte."
async function ecrire() {
await writeFile("exemple.txt", contenu)
console.log("Fichier écrit avec succès !")
}
ecrire()Si le fichier n'existe pas, il est créé. S'il existe, il est remplacé.
API synchrone (à éviter en serveur)
import { readFileSync, writeFileSync } from "node:fs"
// Bloque le thread jusqu'à la fin de l'opération
const data = readFileSync("exemple.txt", "utf8")
writeFileSync("sortie.txt", data.toUpperCase())readFileSync en serveur
En serveur HTTP, readFileSync bloque toute la boucle d'événements pendant la lecture. Si le fichier est volumineux ou le disque lent, toutes les autres requêtes en attente sont bloquées. Réservez les API synchrones aux scripts CLI et aux fichiers de configuration au démarrage.
🌊 Lectures et écritures en flux
Pour les gros fichiers, les streams évitent de tout charger en mémoire :
import { createReadStream, createWriteStream } from "node:fs"
import { pipeline } from "node:stream"
import { createGzip } from "node:zlib"
// Lire un gros fichier par morceaux et le compresser
async function compresser() {
await pipeline(
createReadStream("gros-fichier.txt"),
createGzip(),
createWriteStream("gros-fichier.txt.gz"),
)
console.log("Compression terminée.")
}
compresser()🔄 Les flux (streams)
Les streams sont des abstractions pour lire ou écrire des données par petits morceaux, au lieu de charger la totalité en mémoire.
Les quatre types de flux :
| Type | Rôle | Exemple Node.js |
|---|---|---|
| Readable | Lecture | fs.createReadStream |
| Writable | Écriture | fs.createWriteStream |
| Duplex | Lecture + écriture | net.Socket |
| Transform | Transformation en lecture/écriture | zlib.createGzip |
Lecture avec flux
import { createReadStream } from "node:fs"
const readStream = createReadStream("gros-fichier.txt", "utf8")
readStream.on("data", (chunk: string) => {
console.log("Nouveau morceau :", chunk)
})
readStream.on("end", () => {
console.log("Lecture terminée.")
})
readStream.on("error", (err) => {
console.error("Erreur :", err)
})Pipeline de streams
import { createReadStream, createWriteStream } from "node:fs"
import { pipeline } from "node:stream"
import { createGzip } from "node:zlib"
async function compresser() {
await pipeline(
createReadStream("input.txt"),
createGzip(),
createWriteStream("input.txt.gz"),
)
console.log("Compression terminée.")
}
compresser()🧊 Les buffers
Les buffers sont des zones de mémoire brute allouées pour stocker des données binaires.
const buffer = Buffer.from("Bonjour")
console.log(buffer) // <Buffer 42 6f 6e 6a 6f 75 72>
console.log(buffer.toString()) // 'Bonjour'
console.log(buffer.length) // 7 (octets)
console.log(buffer[0]) // 66 (code ASCII de 'B')Un buffer peut être créé à partir d'une string, d'un tableau d'octets, ou d'un buffer existant :
const fromString = Buffer.from("Hello", "utf8")
const fromArray = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f])
const empty = Buffer.alloc(1024) // 1024 octets de zéros📋 Récapitulatif
| Concept | Quand l'utiliser |
|---|---|
fs.readFile / fs.writeFile | Fichiers petits/moyens, opération ponctuelle |
fs.readFileSync / writeFileSync | Scripts CLI, configuration au démarrage uniquement |
fs/promises + await | Code asynchrone moderne, serveurs, APIs |
| Streams | Fichiers volumineux, transferts, transformations |
| Buffer | Données binaires, manipulation de flux bruts |
Quiz du chapitre
Node.js
Terminez le quiz du chapitre pour le marquer comme complété.