2014-06-28 12 views
7

Piszę program o czysto synchronicznym pojedynczym wątku w programie node.js, który musi zapisać pojedynczy plik binarny, dla którego używam WriteStream. Wykorzystanie mój wzór jest wzdłuż linii:Node.js WriteStream synchronous

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

To wydaje się działać, ale dokumentacja mówi, że to asynchroniczny i chcę się upewnić, że nie piszę kod, który działa 99% czasu. Nie obchodzi mnie dokładnie, kiedy dane są zapisywane, o ile są napisane w określonej kolejności i nie później niż po wyjściu programu, a ilość danych jest mała, więc szybkość i zużycie pamięci nie są problemami.

Widziałem wzmiankę o stream.end(), ale wygląda na to, że działa bez niej i widziałem również sugestie, że wywoływanie jej może być złym pomysłem, jeśli nie używasz wywołań zwrotnych, ponieważ może to w końcu zostać wywołane przed wszystkim dane są zapisywane.

Czy moje podejście jest prawidłowe (biorąc pod uwagę, że chcę mieć charakter czysto synchroniczny) lub czy jest coś, na co muszę uważać?

+1

Nie jestem do końca pewien, czy pasowałoby to do twojego przypadku użycia (i zdaj sobie sprawę, że to może nie być dokładnie to, szukasz), ale czy rozważałeś użycie opcji 'fs.write' jako opcji synchronicznej? http://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback – imjared

+0

@imjared Dobre pytanie! synchroniczna wersja tego wydaje się wykonywać tę pracę. Jaka jest różnica między tymi dwoma? lub umieścić w inny sposób, biorąc pod uwagę jego istnienie, jaki jest powód istnienia WriteStream? Czy WriteStream jest przeznaczony głównie do pisania tekstu? – rwallace

+1

Szczerze mówiąc nie mam najlepszego zrozumienia strumieni, ale kiedy potrzebuję synchronicznego podejścia do pisania czegoś. Oto znacznie lepsze wyjaśnienie, niż mógłbym podać: http://stackoverflow.com/a/8770026/628699 – imjared

Odpowiedz

4

Możesz to zrobić, jedynym problemem może być utworzenie dwóch lub więcej równoczesnych strumieni dla tej samej ścieżki: kolejność zapisów z różnych strumieni będzie niezdefiniowana. Nawiasem mówiąc, istnieje synchroniczna implementacja strumienia zapisu fs w węźle: fs.SyncWriteStream. Jest to trochę prywatne i wymaga fd jako argumentu, ale jeśli naprawdę tego chcesz ...

+2

Nie musisz używać 'fs.SyncWriteStream'. Po prostu wykonaj 'fd = openSync', a następnie wykonaj' readSync' używając tego 'fd'. – Pacerier

+2

Co to jest API? Jak mogę wywołać tę funkcję? Przykład byłby bardzo pomocny! –