Đọc tiếp bài viết dưới đây trên Mytour để hiểu rõ hơn về khái niệm Stream trong Node.js, cũng như cách thức ghi và đọc dữ liệu từ Stream.
Khám phá đầy đủ về Stream trong Node.js
Danh sách nội dung
1. Stream trong Node.js là gì?
2. Có bao nhiêu loại Stream trong Node.js?
3. Đọc dữ liệu từ Stream trong Node.js
4. Ghi dữ liệu tới Stream trong Node.js
5. Khái niệm Piping Stream trong Node.js
6. Khái niệm Chaining Stream trong Node.js
1. Stream trong Node.js là gì?
Stream trong Node.js là những đối tượng giúp đọc dữ liệu từ nguồn và ghi dữ liệu vào đích.
2. Trong Node.js có mấy loại Stream?
Có tổng cộng 4 loại Stream trong Node.js, bao gồm:
- Readable: Stream này được sử dụng cho các hoạt động đọc.
- Writable: Stream này được sử dụng cho các hoạt động ghi.
var fs = require('fs');
var data = '';
// Tạo một luồng có thể đọc
var readerStream = fs.createReadStream('input.txt');
// Thiết lập mã hóa là utf8.
readerStream.setEncoding('UTF8');
// Xử lý các sự kiện của luồng --> dữ liệu, kết thúc, và lỗi
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('Chương trình đã kết thúc');
Tiếp theo, khởi chạy Node.js command prompt và thực hiện file main.js:
node main.js
Kết quả xuất ra:
4. Ghi dữ liệu vào Stream trong Node.js
Tạo một file JavaScript với tên là main.js, có chứa đoạn mã sau đây:
var fs = require('fs');
var data = 'Một Giải pháp cho Mọi Công Nghệ';
// Tạo một luồng có thể ghi
var writerStream = fs.createWriteStream('output.txt');
// Ghi dữ liệu vào luồng với mã hóa là utf8
writerStream.write(data,'UTF8');
// Đánh dấu kết thúc của tệp
writerStream.end();
// Xử lý sự kiện của luồng --> hoàn thành, và lỗi
writerStream.on('finish', function() {
console.log('Viết hoàn thành.');
});
writerStream.on('error', function(err){
console.log(err.stack);
});
console.log('Chương trình đã kết thúc');
Tiếp theo, mở Node.js command prompt và chạy file main.js:
node main.js
Kết quả xuất ra sẽ có dạng như sau:
Như bạn có thể thấy, tệp văn bản có tên là output.txt đã được tạo ra ở cùng nơi với tệp input.txt và main.js. Trong ví dụ này, đó là trên màn hình desktop.
Mở tệp output.txt và trên màn hình, bạn sẽ thấy nội dung như sau:
5. Piping Stream là gì?
Piping là một cơ chế cung cấp kết quả đầu ra của một Stream để làm dữ liệu đầu vào cho một Stream khác. Piping thường được sử dụng để lấy dữ liệu từ một Stream và sử dụng làm dữ liệu đầu vào cho một Stream khác mà không có bất kỳ giới hạn nào về hoạt động Piping này. Dưới đây là một ví dụ về việc sử dụng Piping để đọc từ một tệp và ghi vào một tệp khác.
Tạo một tệp JavaScript với tên là main.js và chứa đoạn mã sau đây:
var fs = require('fs');
// Tạo một luồng có thể đọc
var readerStream = fs.createReadStream('input.txt');
// Tạo một luồng có thể ghi
var writerStream = fs.createWriteStream('output.txt');
// Kết nối các hoạt động đọc và ghi
// đọc input.txt và ghi dữ liệu vào output.txt
readerStream.pipe(writerStream);
console.log('Chương trình đã kết thúc');
Bước tiếp theo, mở Node.js command prompt và chạy main.js:
thực thi main.js
Kết quả xuất ra:
Bạn sẽ thấy tệp văn bản có tên là output.txt đã được tạo ra tại vị trí mà tệp input.txt và main.js được lưu. Trong ví dụ này, đó là trên màn hình desktop.
Mở tệp output.txt và bạn sẽ thấy nội dung như sau trên màn hình:
6. Chuỗi Stream trong Node.js
Chaining stream là cơ chế liên kết các hoạt động đa luồng bằng cách nối đầu ra của một luồng với luồng khác, thường được sử dụng cùng với piping. Dưới đây là ví dụ kết hợp piping và chuỗi stream để nén một tệp, sau đó giải nén.
Tạo một tệp JavaScript với tên là main.js và chứa đoạn mã sau đây:
var fs = require('fs');
var zlib = require('zlib');
// Nén tệp input.txt thành input.txt.gz
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log('Tệp được Nén.');
Bước kế tiếp, mở cửa sổ lệnh Node.js và chạy main.js:
node main.js
Kết quả trả về sẽ có dạng:
Bạn sẽ thấy tệp input.txt đã được nén và tạo ra một tệp mới có tên là input.txt.gz nằm trong thư mục hiện tại.
Để giải nén tệp, bạn thêm mã sau vào tệp main.js:
var fs = require('fs');
var zlib = require('zlib');
// Giải nén tệp input.txt.gz thành input.txt
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log('Tệp đã được giải nén.');
Bước tiếp theo, mở cửa sổ lệnh Node.js và chạy main.js:
node main.js
Dạng kết quả trả về như sau:
Bài viết trên đây của Mytour giới thiệu về Stream trong Node.js là gì. Bạn cũng có thể tham khảo thêm một số bài viết Học Node.js trên Mytour để hiểu rõ hơn về cách cài đặt Node.js và khái niệm Callback trong Node.js là gì nhé.