Gli stream - Modulo fs di NodeJS

Un concetto molto importante in node sono gli stream (flusso) , un flusso di dati che si spostano da un punto sorgente ad una destinazione.
Gli stream sono importanti per due motivi principali:
- perché garantiscono efficienza dal punto di vista della memoria;
- perché garantiscono efficienza dal punto di vista della velocità di elaborazione.
Per capire il perché basta fare l'esempio del servizio di streaming Youtube o Netflix, affinché noi possiamo vedere un film su Netflix o un video YouTube non dobbiamo certamente attendere di ricevere l'intero video, ma possiamo usufruirne man mano che riceviamo il video. Man mano che riceviamo i dati in ingresso, il nostro dispositivo riceve un flusso continuo di dati che prende in carico ed elabora, permettendone la visione.
Il metodo createReadStream
Gli stream sono molto utili quando dobbiamo lavorare con file di grosse dimensioni. Lavorando con gli stream possiamo evitare di dover caricare il file intero in memoria prima di poterlo elaborare o anche inviare come risposta ad una richiesta di un client.
createReadStream.js
const fs = require('fs');
const readable = fs.createReadStream('nuovoFile.txt',
{econding : 'utf8' , highWaterMark : 16 });
readable.on('data', dati => {
console.log(dati + '...');
});
Spiegazione step by step:
const fs = require('fs');
Importiamo il modulo nativo fs di node
const readable = fs.createReadStream('nuovoFile.txt',
{econding : 'utf8' , highWaterMark : 16 });
Per leggere da un file con il meccanismo degli stream utilizziamo il metodo fs.createReadStream .
Definiamo una costante readable, un oggetto di tipo ride stream che ci permette di gestire il flusso di dati e quindi invochiamo su fs il metodo createReadStream, passiamo come primo parametro il percorso ed il nome del file e come secondo parametro un oggetto con due proprietà:
- la proprietà encoding con valore uft8
- la proprietà highWaterMark con valore 16
Nell'esempio sopra, ogni volta che vengono letti 16bite del file nuovoFile.txt , node solleva l'oggetto 'data' che andremo poi a gestire con l'oggetto readable.
readable.on('data', dati => {
console.log(dati + '...');
});
Gli stream lavorano con gli eventi, quando sono disponibili highWaterMark, node emette un oggetto data che possiamo andare a gestire, in questo caso invochiamo .on per gestire l'oggetto data, e come secondo parametro passiamo la callback che riceverà in input i dati letti.
