Streams là các đối tượng tạo điều kiện cho bạn đọc dữ liệu từ nguồn và ghi dữ liệu vào đích. Có bốn loại Streams trong Node.js:
- Readable: Streams này được sử dụng cho các hoạt động đọc.
- Writable: Streams này được sử dụng cho các hoạt động ghi.
- Duplex: Streams này có thể được sử dụng cho cả hoạt động đọc và ghi.
- Transform: Đây là loại Streams song công trong đó đầu ra được tính toán theo đầu vào.
Các bài viết liên quan:
Mỗi loại Streams là một cá thể Bộ phát sự kiện và ném một số sự kiện vào các thời điểm khác nhau. Sau đây là một số sự kiện thường được sử dụng:
- Data: Sự kiện này được kích hoạt khi có sẵn dữ liệu để đọc.
- End: Sự kiện này được kích hoạt khi không còn dữ liệu nào để đọc.
- Error: Sự kiện này được kích hoạt khi có bất kỳ lỗi nào khi nhận hoặc ghi dữ liệu.
- Finish: Sự kiện này được kích hoạt khi tất cả dữ liệu đã được chuyển đến hệ thống cơ bản.
Node.js Reading from stream
Tạo một tệp văn bản có tên input.txt có nội dung sau:
Chúng tôi là một trong những trang web hướng dẫn trực tuyến tốt nhất để tìm hiểu các công nghệ khác nhau một cách rất dễ dàng và hiệu quả.
Tạo một tệp JavaScript có tên main.js có mã sau:
File: main.js
var fs = require("fs"); var data = ''; // Create a readable stream var readerStream = fs.createReadStream('input.txt'); // Set the encoding to be utf8. readerStream.setEncoding('UTF8'); // Handle stream events --> data, end, and error readerStream.on('data', function(chunk) { data += chunk; }); readerStream.on('end',function(){ console.log(data); }); readerStream.on('error', function(err){ console.log(err.stack); }); console.log("Program Ended");
Bây giờ, hãy mở dấu nhắc lệnh Node.js và chạy main.js
node main.js
Node.js Writing to stream
Tạo một tệp JavaScript có tên main.js có mã sau:
File: main.js
var fs = require("fs"); var data = 'testing write file'; // Create a writable stream var writerStream = fs.createWriteStream('output.txt'); // Write the data to stream with encoding to be utf8 writerStream.write(data,'UTF8'); // Mark the end of file writerStream.end(); // Handle stream events --> finish, and error writerStream.on('finish', function() { console.log("Write completed."); }); writerStream.on('error', function(err){ console.log(err.stack); }); console.log("Program Ended");
Bây giờ hãy mở dấu nhắc lệnh Node.js và chạy main.js
node main.js
Bạn sẽ thấy kết quả sau:
Bây giờ, bạn có thể thấy rằng một tệp văn bản có tên “output.txt” được tạo tại nơi bạn đã lưu tệp “input.txt” và “main.js”. Trong trường hợp của tôi, nó là trên máy tính để bàn.
Node.js Piping Streams
Đường ống là một cơ chế trong đó đầu ra của một Streams được sử dụng làm đầu vào cho một Streams khác. Không có giới hạn về hoạt động của đường ống.
Hãy lấy một ví dụ về đường ống để đọc từ một tệp và ghi nó vào một tệp khác.
File: main.js
var fs = require("fs"); // Create a readable stream var readerStream = fs.createReadStream('input.txt'); // Create a writable stream var writerStream = fs.createWriteStream('output.txt'); // Pipe the read and write operations // read input.txt and write data to output.txt readerStream.pipe(writerStream); console.log("Program Ended");
Mở Node.js và chạy main.js:
node main.js
Bây giờ, bạn có thể thấy rằng một tệp văn bản có tên “output.txt” được tạo ở nơi bạn đã lưu? Main.js? tập tin. Trong trường hợp của tôi, nó là trên máy tính để bàn.
Node.js Chaining Streams
Chuỗi chuỗi là một cơ chế tạo ra một chuỗi hoạt động của nhiều Streams bằng cách kết nối đầu ra của một Streams này với một Streams khác. Nó thường được sử dụng với hoạt động đường ống.
Hãy lấy một ví dụ về đường ống và chuỗi để nén một tệp và sau đó giải nén cùng một tệp.
File: main.js
var fs = require("fs"); var zlib = require('zlib'); // Compress the file input.txt to input.txt.gz fs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log("File Compressed.");
Mở Node.js và chạy mian.js
node main.js
Bạn sẽ nhận được kết quả sau:
Bây giờ bạn sẽ thấy tệp “input.txt” đã được nén và một tệp mới được tạo có tên “input.txt.gz” trong tệp hiện tại.
Để giải nén cùng một tệp: đặt mã sau vào tệp js “main.js”
File: main.js
var fs = require("fs"); var zlib = require('zlib'); // Decompress the file input.txt.gz to input.txt fs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('input.txt')); console.log("File Decompressed.");
Mở dấu nhắc lệnh Node.js và chạy main.js
node main.js