2014-06-28 15 views
7

Tôi đang viết một chương trình dòng lệnh đơn luồng hoàn toàn đồng bộ trong node.js, cần phải viết một tệp nhị phân duy nhất, mà tôi đang sử dụng WriteStream. mô hình sử dụng của tôi là dọc theo dòng:Node.js WriteStream đồng bộ

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

Điều này dường như làm việc, nhưng các tài liệu nói nó không đồng bộ và tôi muốn chắc chắn rằng tôi không viết code mà làm việc 99% thời gian. Tôi không quan tâm chính xác khi dữ liệu được viết miễn là nó được viết theo thứ tự được chỉ định và không muộn hơn khi chương trình thoát, và số lượng dữ liệu nhỏ nên tốc độ và mức tiêu thụ bộ nhớ không phải là vấn đề.

Tôi đã xem đề cập đến stream.end() nhưng có vẻ như không hoạt động và tôi cũng thấy các đề xuất gọi đó có thể là một ý tưởng tồi nếu bạn không sử dụng gọi lại bởi vì nó có thể sẽ được gọi trước khi tất cả dữ liệu được viết.

Cách tiếp cận của tôi có đúng không (với điều kiện tôi muốn hoàn toàn đồng bộ) hoặc có bất kỳ điều gì tôi cần xem không?

+1

Tôi không hoàn toàn chắc chắn nếu điều này phù hợp với trường hợp sử dụng của bạn (và nhận ra rằng nó có thể không hoàn toàn tìm kiếm) nhưng bạn có xem xét chỉ sử dụng 'fs.write' làm tùy chọn đồng bộ không? http://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback – imjared

+0

@imjared Câu hỏi hay! phiên bản đồng bộ của điều đó dường như thực hiện công việc. Sự khác nhau giữa hai cái là gì? hoặc đặt một cách khác, với sự tồn tại của điều đó, lý do cho sự tồn tại của WriteStream là gì? WriteStream có chủ yếu dành cho việc viết văn bản không? – rwallace

+1

là hoàn toàn trung thực Tôi không có sự hiểu biết tốt nhất của suối nhưng bất cứ khi nào tôi đã cần một cách tiếp cận đồng bộ để viết một cái gì đó. Đây là một lời giải thích tốt hơn nhiều so với tôi có thể cung cấp cho: http://stackoverflow.com/a/8770026/628699 – imjared

Trả lời

4

Bạn có thể thực hiện việc này, vấn đề duy nhất có thể là nếu bạn tạo hai hoặc nhiều luồng đồng thời cho cùng một đường dẫn: thứ tự ghi từ các luồng khác nhau sẽ không được xác định. Nhân tiện, có một quá trình thực hiện ghi dòng fs đồng bộ trong nút: fs.SyncWriteStream. Đó là loại riêng tư và yêu cầu fd làm đối số, nhưng nếu bạn thực sự muốn ...

+2

Bạn không phải sử dụng 'fs.SyncWriteStream'. Chỉ cần làm một 'fd = openSync' và sau đó thực hiện một' readSync' bằng cách sử dụng 'fd' đó. – Pacerier

+2

API là gì? Làm thế nào tôi có thể gọi hàm này. Một ví dụ sẽ khá hữu ích! –

Các vấn đề liên quan