2014-06-28 11 views
7

Ich schreibe ein rein synchrone, single-threaded Befehlszeilenprogramm in node.js, die eine einzelne Binärdatei schreiben muss, für die ich WriteStream verwende. Mein Nutzungsmuster ist entlang der Linien von:Node.js WriteStream synchron

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

Dies scheint zu funktionieren, aber die Dokumentation sagt, es ist asynchron und ich möchte sicherstellen, ich schreibe Code nicht, dass 99% der Zeit arbeitet. Es ist mir egal, wann die Daten geschrieben werden, solange sie in der angegebenen Reihenfolge geschrieben sind, und nicht später als beim Beenden des Programms, und die Datenmenge ist klein, so dass Geschwindigkeit und Speicherverbrauch keine Probleme sind.

Ich habe die Erwähnung von stream.end() gesehen, aber es scheint ohne zu funktionieren und ich habe auch Vorschläge gesehen, dass das Anrufen eine schlechte Idee sein könnte, wenn Sie keine Callbacks verwenden, weil es am Ende vor allem aufgerufen werden könnte Die Daten werden geschrieben.

Ist mein Ansatz korrekt (vorausgesetzt, dass ich rein synchron bin) oder muss ich etwas aufpassen?

+1

Ich bin nicht ganz sicher, ob dies in Ihren Anwendungsfall passen würde (und erkennt, dass es nicht ganz sein, was du bist suchen) aber haben Sie darüber nachgedacht, 'fs.write' als synchrone Option zu benutzen? http://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback – imjared

+0

@imjared Gute Frage! die synchrone Version davon scheint die Aufgabe zu erfüllen. Was ist der Unterschied zwischen den beiden? Oder anders ausgedrückt, was ist der Grund für die Existenz von WriteStream? Ist WriteStream hauptsächlich zum Schreiben von Text gedacht? – rwallace

+1

um ganz ehrlich zu sein Ich habe nicht das beste Verständnis für Streams, aber wann immer ich eine synchrone Vorgehensweise benötigt habe, um etwas zu schreiben. Hier ist eine viel bessere Erklärung, als ich geben könnte: http://stackoverflow.com/a/8770026/628699 – imjared

Antwort

4

Sie können dies tun, das einzige Problem kann sein, wenn Sie zwei oder mehr gleichzeitige Streams für den gleichen Pfad erstellen: Die Reihenfolge der Schreibvorgänge aus verschiedenen Streams wird nicht definiert. Übrigens gibt es eine synchrone fs-Schreibstromimplementierung in dem Knoten: fs.SyncWriteStream. Es ist eine Art von privaten und erfordert fd als Argument, aber wenn man es wirklich will ...

+2

Sie müssen 'fs.SyncWriteStream' nicht verwenden. Machen Sie einfach ein 'fd = openSync' und führen Sie' readSync' mit dem 'fd' aus. – Pacerier

+2

Was ist die API? Wie kann ich diese Funktion aufrufen? Ein Beispiel wäre sehr hilfreich! –