TW3 — Technologies du Web 3

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 :

TypeRôleExemple Node.js
ReadableLecturefs.createReadStream
WritableÉcriturefs.createWriteStream
DuplexLecture + écriturenet.Socket
TransformTransformation en lecture/écriturezlib.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

ConceptQuand l'utiliser
fs.readFile / fs.writeFileFichiers petits/moyens, opération ponctuelle
fs.readFileSync / writeFileSyncScripts CLI, configuration au démarrage uniquement
fs/promises + awaitCode asynchrone moderne, serveurs, APIs
StreamsFichiers volumineux, transferts, transformations
BufferDonnées binaires, manipulation de flux bruts

Quiz du chapitre

2 questions
0 / 2 répondue0%
  1. 1Quel module intégré de Node.js permet de lire et écrire des fichiers sans installation externe ?
  2. 2Pourquoi les streams sont-ils utiles pour les gros fichiers en Node.js ?
Répondez à toutes les questions pour valider.

Node.js

Terminez le quiz du chapitre pour le marquer comme complété.

Tableau de bord

On this page