Tìm hiểu về các stream (luồng) trong Node.js

Luồng là gì?

Luồng là các đối tượng cho phép bạn đọc dữ liệu từ nguồn hoặc ghi dữ liệu đến đích theo cách liên tục. Trong Node.js, có bốn loại luồng –

  • Readable – Luồng được sử dụng cho hoạt động đọc.
  • Writable – Luồng được sử dụng cho thao tác ghi.
  • Duplex – Luồng có thể được sử dụng cho cả thao tác đọc và ghi.
  • Transform – Một loại luồng song song trong đó đầu ra được tính toán dựa trên đầu vào.

Mỗi loại Luồng là một phiên bản EventEuctor và đưa một số sự kiện vào các thời điểm khác nhau. Ví dụ: một số sự kiện thường được sử dụng là –

  • data – Sự kiện này được kích hoạt khi có dữ liệu có sẵn để đọc.
  • end – Sự kiện này được kích hoạt khi không còn dữ liệu để đọc.
  • error– Sự kiện này được kích hoạt khi có bất kỳ lỗi 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 sang hệ thống cơ bản.

Hướng dẫn này cung cấp hiểu biết cơ bản về các hoạt động thường được sử dụng trên Luồng.

Đọc từ một luồng

Tạo một tệp văn bản có tên input.txt có nội dung sau –

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Tạo một tệp js có tên main.js với đoạn code sau –

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 chạy main.js để xem kết quả –

$ node main.js

Xác nhận đầu ra.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Ghi cho một luồng

Tạo một tệp js có tên main.js với đoạn code sau –


var fs = require("fs");
var data = 'Simply Easy Learning';

// 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 chạy main.js để xem kết quả –

$ node main.js

Xác nhận đầu ra.

Program Ended
Write completed.

Bây giờ hãy mở output.txt được tạo trong thư mục hiện tại của bạn; nó nên chứa những điều sau đây –

Simply Easy Learning

Đường dẫn các luồng

Đường dẫn (piping the stream) là một cơ chế trong đó cung cấp đầu ra của một luồng làm đầu vào cho luồng khác. Nó thường được sử dụng để lấy dữ liệu từ một luồng và để chuyển đầu ra của luồng đó sang luồng khác. Không có giới hạn về hoạt động đường dẫn. Bây giờ chúng ta sẽ hiển thị một ví dụ đường dẫn để đọc từ một tệp và ghi nó sang tệp khác.

Tạo một tệp js có tên main.js với đoạn code sau –

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");

Bây giờ hãy chạy main.js để xem kết quả –

$ node main.js

Xác nhận đầu ra.

Program Ended

Mở output.txt được tạo trong thư mục hiện tại của bạn; nó nên chứa những điều sau đây –

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Xâu chuỗi các luồng

Chaining (xâu chuỗi) là một cơ chế để kết nối đầu ra của một luồng với luồng khác và tạo ra một chuỗi các hoạt động nhiều luồng. Nó thường được sử dụng với các hoạt động đường dẫn. Bây giờ chúng ta sẽ sử dụng đường dẫn và xâu chuỗi để trước tiên nén một tệp và sau đó giải nén tương tự.

Tạo một tệp js có tên main.js với đoạn code sau –

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.");

Bây giờ hãy chạy main.js để xem kết quả –

$ node main.js

Xác nhận đầu ra.

File Compressed.

Bạn sẽ thấy rằng input.txt đã được nén và nó đã tạo một tệp input.txt.gz trong thư mục hiện tại. Bây giờ hãy thử giải nén cùng một tệp bằng code sau –

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.");

Bây giờ hãy chạy main.js để xem kết quả –

$ node main.js

Xác nhận đầu ra.

File Decompressed.

 

 

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *