2014-06-28 13 views
7

Sto scrivendo un programma di riga di comando puramente sincrono a thread singolo in node.js, che deve scrivere un singolo file binario, per il quale sto usando WriteStream. Il mio modello di utilizzo è lungo le linee di:Node.js WriteStream sincrono

var stream = fs.createWriteStream(file) 
stream.write(buf1) 
stream.write(buf2) 

Questo sembra funzionare, ma la documentazione dice che è asincrona e voglio fare in modo che non sto scrivendo codice che funziona il 99% del tempo. Non mi interessa esattamente quando i dati vengono scritti, purché siano scritti nell'ordine specificato e non più tardi di quando il programma si chiude, e la quantità di dati è piccola, quindi la velocità e il consumo di memoria non sono problemi.

Ho visto la menzione di stream.end() ma sembra funzionare senza di essa e ho anche visto suggerimenti che chiamarlo potrebbe essere una cattiva idea se non si utilizzano callback perché potrebbe finire per essere chiamato prima di tutto i dati sono scritti

Il mio approccio è corretto (dato che voglio puramente sincrono) o c'è qualcosa che devo fare attenzione?

+1

Non sono del tutto sicuro se questo si adatta al tuo caso d'uso (e riconosco che potrebbe non essere proprio quello che sei cercando) ma hai considerato solo l'uso di 'fs.write' come opzione sincrona? http://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback – imjared

+0

@imjared Buona domanda! la versione sincrona di quello sembrerebbe fare il lavoro. Qual è la differenza tra i due? o mettere un altro modo, data l'esistenza di quello, qual è la ragione per l'esistenza di WriteStream? WriteStream è destinato principalmente alla scrittura di testo? – rwallace

+1

per essere perfettamente onesto, non ho la migliore comprensione dei flussi ma ogni volta che ho bisogno di un approccio sincrono per scrivere qualcosa. Ecco una spiegazione molto migliore di quella che potrei dare: http://stackoverflow.com/a/8770026/628699 – imjared

risposta

4

È possibile eseguire questa operazione, l'unico problema può essere se si creano due o più flussi simultanei per lo stesso percorso: l'ordine delle scritture da flussi diversi non sarà definito. A proposito, esiste un'implementazione di flusso di scrittura fs sincrono nel nodo: fs.SyncWriteStream. È una specie di privato e richiede fd come argomento, ma se lo vuoi davvero ...

+2

Non è necessario utilizzare 'fs.SyncWriteStream'. Basta fare un 'fd = openSync' e poi fare un' readSync' usando quel 'fd'. – Pacerier

+2

Qual è l'API? Come posso invocare questa funzione. Un esempio sarebbe piuttosto utile! –