Ecco come vorrei spiegare le differenze:
di basso livello:
fs.open e fs.close lavoro su descrittori di file. Queste sono funzioni di basso livello e rappresentano le chiamate di mappa alle chiamate di sistema BSD open(2). Come avrai un descrittore di file, staresti usando questi con fs.read o fs.write.
nota, tutti questi sono asincroni e non ci sono versioni sincrone così: fs.openSync, fs.closeSync, fs.readSync, fs.writeSync, dove si sarebbe non utilizzare un callback. La differenza tra le versioni asincrona e sincrona è che fs.openSync
restituisce solo quando l'operazione di apertura del file è stata completata, mentre fs.open
restituisce immediatamente e si utilizzerà il descrittore di file nella richiamata.
Queste funzioni di basso livello ti danno pieno controllo, ma significano molto più codifica.
di livello medio:
fs.createReadStream e fs.createWriteStream creano oggetti stream che è possibile cablare agli eventi. Gli esempi per questi eventi sono "dati" (quando una porzione di dati è stata letta, ma quel blocco è solo una parte del file) o "chiuso". I vantaggi di questo sono che è possibile leggere un file ed elaborarlo mentre i dati arrivano, cioè non è necessario leggere l'intero file, tenerlo in memoria e quindi elaborarlo. Ciò ha senso quando si ha a che fare con file di grandi dimensioni in quanto è possibile ottenere prestazioni migliori nell'elaborazione di bit in blocchi piuttosto che occuparsi dell'intero file (ad esempio, un intero file da 1 GB in memoria).
Alto livello:
fs.readFile e fs.writeFile operare su tutto il file. Quindi chiamereste fs.readFile
, il nodo leggerà l'intero file e quindi vi presenterà l'intero dato nel vostro callback. Il vantaggio di questo è che non è necessario gestire blocchi di dimensioni diverse (come quando si usano gli stream). Durante la scrittura, il nodo scriverebbe l'intero file. Lo svantaggio di questo approccio è che durante la lettura/scrittura, si dovrebbe avere l'intero file in memoria. Ad esempio, se si sta trasformando un file di registro, potrebbero essere necessarie solo linee di dati, utilizzando i flussi è possibile farlo senza dover attendere che il file venga letto completamente prima di iniziare a scrivere.
Ci sono anche, fs.readFileSync e fs.writeFileSync che non utilizzano una richiamata, ma attendere che la lettura/scrittura finisca prima di tornare. Il vantaggio di utilizzare questo è che per un file di piccole dimensioni, non si può voler fare nulla prima che il file ritorni, ma per i file di grandi dimensioni significherebbe che la CPU sarebbe inattiva via in attesa che l'I/O del file finisse.
La speranza che ha senso e in risposta alla tua domanda, quando si utilizza fs.writeFile
non è necessario fs.open
o fs.close
.