Quiz : Maîtrise de l’E/S Node.js
Testez vos connaissances des fichiers, flux et tampons
Prêt à plonger dans l’univers du I/O NodeJS ? 🌊
Ce quiz évaluera votre maîtrise des opérations d’I/O de Node, des tâches de base du système de fichiers aux concepts avancés de streaming. Nous aborderons les buffers, les encodages et les bonnes pratiques pour manipuler les données de façon efficace.
Voyons à quel point vous distinguez vos streams de vos buffers ! 🚀
Que va-t‑il afficher ?
const buf = Buffer.from([65]);console.log(buf.toString());Les nombres dans le tableau représentent des codes ASCII :
- 65 : ‘A’
toString() convertit ces octets en leur représentation chaîne en utilisant l’encodage UTF‑8 par défaut.
Quel est l’ordre de sortie ?
import fs from 'fs';fs.readFile('test.txt', 'utf8', (err, data) => { console.log(data);});console.log('Done');Comme readFile est asynchrone, le code continue de s’exécuter pendant que le fichier est lu.
Par conséquent, “Done” sera affiché avant le contenu du fichier.
Pour attendre que le fichier soit lu d’abord, vous pouvez utiliser la version basée sur les Promises :
import { promises as fs } from 'fs';
async function read() { const data = await fs.readFile('test.txt', 'utf8'); console.log(data); console.log('Done');}Que renvoie fs.readFileSync() par défaut ?
import fs from 'fs';const content = fs.readFileSync('test.txt');fs.readFileSync() renvoie un Buffer par défaut lorsqu’aucun encodage n’est spécifié. Si vous voulez une chaîne, vous devez soit :
- Spécifier un encodage :
fs.readFileSync('test.txt', 'utf8') - Convertir le Buffer :
content.toString()
En savoir plus sur fs.readFileSync dans la documentation Node.js
Quel ensemble d’événements est couramment utilisé avec les flux Readable ?
Les flux Readable émettent plusieurs événements importants :
- ‘data’ : lorsque des données sont disponibles à la lecture
- ‘end’ : lorsqu’il n’y a plus de données à lire
- ‘error’ : lorsqu’une erreur se produit
- ‘close’ : lorsque le flux et la ressource sous-jacente sont fermés
const readable = fs.createReadStream('file.txt');readable.on('data', chunk => console.log(chunk));readable.on('end', () => console.log('Done!'));Que fait l’option recursive ?
import fs from 'fs';fs.mkdirSync('./a/b/c', { recursive: true });L’option recursive: true crée les répertoires parents s’ils n’existent pas.
Sans cette option, tenter de créer ’./a/b/c’ lancerait une erreur si ’./a’ ou ’./a/b’ n’existent pas.
C’est similaire à la commande shell mkdir -p.
Quel sera le résultat ?
import { Transform } from 'stream';const upperCase = new Transform({ transform(chunk, encoding, callback) { callback(null, chunk.toString().toUpperCase()); }});process.stdin .pipe(upperCase) .pipe(process.stdout);// Input: "hello world"Les flux de transformation modifient les données au passage. Ici, chaque morceau est :
- Converti en chaîne
- Transformé en majuscules
- Envoyé vers stdout
Cela crée un pipeline qui convertit toutes les entrées en majuscules.
Combien de fois fs.watch() est‑il garanti de se déclencher lorsqu’un fichier est modifié ?
import fs from 'fs';fs.watch('test.txt', (eventType, filename) => { console.log(`${filename} was changed`);});// Then modify test.txt oncefs.watch() n’est pas garanti de se déclencher exactement une fois par modification logique du fichier. Il se déclenche souvent plusieurs fois parce que de nombreux éditeurs de texte :
- Enregistrent dans un fichier temporaire
- Le renomment en fichier cible
Pour une surveillance plus fiable, envisagez d’utiliser :
- Le package
chokidar - Un debounce du rappel
fs.watchFile()(bien que moins efficace)
Quel est le but principal de la rétropression des flux ?
La rétropression est un mécanisme qui empêche le débordement de mémoire en suspendant la lecture lorsque l’extrémité d’écriture ne peut pas suivre.
Exemple de rétropression manuelle :
readable.on('data', (chunk) => { const canContinue = writable.write(chunk); if (!canContinue) { readable.pause(); writable.once('drain', () => readable.resume()); }});pipe() gère cela automatiquement!
Que fait ce code ?
import fs from 'fs';fs.symlinkSync('target.txt', 'link.txt');symlinkSync crée un lien symbolique (comme un raccourci) vers le fichier cible.
Principales différences avec les liens physiques :
- Peut lier des répertoires
- Peut traverser des systèmes de fichiers
- Se rompt si la cible est supprimée
Pour créer un lien physique à la place :
fs.linkSync('target.txt', 'hardlink.txt');Dans quels modes les flux Node.js peuvent-ils fonctionner ?
Les flux peuvent fonctionner en :
- Mode binaire (par défaut) : pour les tampons et les chaînes
- Mode objet : pour les valeurs JavaScript autres que
null, qui signale la fin d’un flux lisible
Exemple de mode objet :
import { Transform } from 'stream';const objectStream = new Transform({ objectMode: true, transform(chunk, encoding, callback) { callback(null, { value: chunk }); }});J’espère que vous avez apprécié tester vos connaissances Node JS IO ! Vous en voulez plus ? Consultez ma collection de quiz pour d’autres défis !
