VietTuts

Tự Học Lập Trình Online

  • Home
  • Java
  • Servlet
  • JSP
  • Struts2
  • Hibernate
  • Spring
  • MyBatis
  • Java WS
  • C
  • C++
  • C#
  • Python
  • PHP
  • Excel
  • VBA
  • Web
    • JavaScript
    • JQUERY
    • JSON
    • AJAX
    • CSS
    • HTML
    • HTML5
    • Node.js
    • Angular 7
  • SQL
    • MySQL
    • SQL Server
  • Misc
    • Eclipse
    • Phần mềm tiện ích
    • Cấu trúc DL&GT
    • Selenium Test

Học Node.js

Node.js là gì? Cài đặt Node.js Giới thiệu qua về Module Ứng dụng Hello World REPL Terminal Node.js NPM Callback trong Node.js Event Loop trong Node.js Lớp EventEmitter Khái niệm Buffer Khái niệm Stream Đọc/Ghi File Các đối tượng Global Đối tượng Console Đối tượng Process Giới thiệu Express Framework RESTFul API là gì? Một số Utility Module Web Module OS Module path Module net Module dns Module domain Module
1 / 3
❮ ❯

Stream trong Node.js


Buffer trong Node.js
Đọc ghi File trong Node.js


Nội dung chính

  • Stream là gì?
  • Đọc dữ liệu từ Stream trong Node.js
  • Ghi dữ liệu tới Stream trong Node.js
  • Khái niệm Piping Stream trong Node.js
  • Khái niệm Chaining Stream trong Node.js

Stream là gì?

Stream là các đối tượng cho phép bạn đọc dữ liệu từ một nguồn và ghi dự liệu đến một đích. Có 4 loại Stream trong Node.js:

  • Readable: Là Stream được sử dụng để cho hoạt động đọc

  • Writable: Là Stream được sử dụng cho hoạt động ghi

  • Duplex: Là Stream được sử dụng cho cả mục đích ghi và đọc

  • Transform: Đây là một kiểu Duplex Stream, khác ở chỗ là kết quả đầu ra được tính toán dựa trên dữ liệu bạn đã nhập vào.

Mỗi loại Stream là một sự thể hiện của đối tượng EventEmitter và ném một vài sự kiện tại các thời điểm khác nhau. Danh sách sau liệt kê một số sự kiện thường được sử dụng:

  • data: Sự kiện này được kích hoạt khi dữ liệu là có sẵn cho hoạt động đọc.

  • end: Sự kiện này được kích hoạt khi không còn dữ liệu nào để đọc nữa.

  • error: Sự kiện này được kích hoạt khi xảy ra bất kỳ lỗi nào trong việc đọc và 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 hết tới vùng hệ thống cơ sở.


Đọc dữ liệu từ Stream trong Node.js

Đầu tiên, bạn tạo một text file với tên input.txt có nội dung sau:

Hoc Stream trong Node.js

Tạo một js file có tên stream1.js. Trong file này, đầu tiên bạn khai báo fs Module (đây là Module cho các hoạt động File I/O) bởi sử dụng phương thức require(). Sau đó sử dụng phương thức createReadStream() nhận tham số là tên của text file bạn đã tạo trước đó để đọc dữ liệu từ đó.


var fs = require("fs");
var data = '';
// Tao mot Readable Stream
var readerStream = fs.createReadStream('input.txt');
// Thiet lap encoding la utf8. 
readerStream.setEncoding('UTF8');
// Xu ly cac su kien lien quan toi Stream: data, end, va 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("Ket thuc chuong trinh");

Bây giờ chạy stream1.js để xem kết quả:


> node stream1.js

Kết quả:

Stream trong Node.js

Ghi dữ liệu tới Stream trong Node.js

Bạn cũng tạo một stream2.js như trên. Khác ở chỗ là thay vì sử dụng createReadStream(), bạn sử dụng phương thức createWriteStream() nhận tham số là file để chứa kết quả bạn cần ghi:


var fs = require("fs");
var data = 'Hoc Stream trong Node.js';
// Tao mot Writable Stream
var writerStream = fs.createWriteStream('output.txt');
// Ghi du lieu toi Stream theo ma hoa utf8
writerStream.write(data,'UTF8');
// Danh dau diem cuoi cua file (end of file)
writerStream.end();
// Xu ly cac su kien lien quan toi Stream: finish va error
writerStream.on('finish', function() {
    console.log("Ket thuc hoat dong ghi.");
});
writerStream.on('error', function(err){
   console.log(err.stack);
});
console.log("Ket thuc chuong trinh");

Bây giờ chạy stream2.js để xem kết quả:


> node stream2.js

Kiểm tra kết quả:

Stream trong Node.js

Bây giờ, bạn mở output.txt đã được tạo trong thư mục hiện tại và kiểm tra nội dung kết quả thu được:

Stream trong Node.js

Khái niệm Piping Stream trong Node.js

Piping là một kỹ thuật. Với kỹ thuật này, chúng ta 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. Không có giới hạn nào về hoạt động Piping này, tức là quá trình trên có thể vẫn tiếp tục.

Để hiểu thêm về khái niệm này, bạn theo dõi ví dụ dưới đây. Trong ví dụ này, mình đọc dữ liệu từ một file, sau đó ghi dữ liệu đó tới một file khác.

Đầu tiên, bạn tạo js file có tên stream3.js chẳng hạn. Trong file này, bạn sử dụng hai phương thức đã trình bày ở trên là createReadStream() và createWriteStream() tương ứng để đọc và ghi dữ liệu. Tiếp đó, sử dụng phương thức pipe() để thực hiện kỹ thuật Piping Stream như sau:


var fs = require("fs");
var data = '';
// Tao mot Readable Stream
var readerStream = fs.createReadStream('input.txt');
// Tao mot Writable Stream
var writerStream = fs.createWriteStream('output.txt');
// Doc file input.txt va ghi vao file output.txt
readerStream.pipe(writerStream);
console.log("Ket thuc chuong trinh");

Chạy stream3.js để xem kết quả:


> node stream3.js

Kết quả:

Stream trong Node.js

Mở output.txt đã được tạo trong thư mục hiện tại của bạn và kiểm tra nội dung:

Stream trong Node.js

Khái niệm Chaining Stream trong Node.js

Chaining là một kỹ thuật để kết nối kết quả đầu ra của một Stream tới một Stream khác và tạo một chuỗi bao gồm nhiều hoạt động Stream. Thường thì nó được sử dụng với các hoạt động Piping.

Ví dụ sau minh họa cách kết hợp hai hoạt động Piping và Chaining. Đầu tiên chúng ta nén một file, sau đó giải nén file đó.

Tạo stream4.js. Trong file này, mình cần khai báo zlip Module cung cấp phương thức createGzip() cho hoạt động nén.


var fs = require("fs");
var zlib = require('zlib');

// nen file input.txt thanh input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("Nen file input.txt thanh input.txt.gz!");

Chạy stream4.js để xem kết quả:


> node stream4.js

Kết quả:

Stream trong Node.js

Sau khi kiểm tra, bạn sẽ thấy rằng input.txt đã được nén và nó đã tạo một input.txt.gz trong thư mục hiện tại. Bây giờ, bạn thử giải nén cùng file trên bởi sử dụng phương thức createGunzip() của zlib Module như sau:


var fs = require("fs");
var zlib = require('zlib');

// nen file input.txt thanh input.txt.gz
fs.createReadStream('input.txt.gz')
   .pipe(zlib.createGunzip())
   .pipe(fs.createWriteStream('input.txt'));
   
console.log("Nen file input.txt thanh input.txt.gz!");

Buffer trong Node.js
Đọc ghi File trong Node.js

Recent Updates

Domain Module trong Node.jsDNS Module trong Node.jsNet Module trong Node.jsPath Module trong Node.jsOS Module trong Node.jsWeb Module trong Node.jsUtility Module trong Node.jsRestFul API trong Node.jsExpress Framework trong Node.jsĐối tượng Process trong Node.jsĐối tượng Console trong Node.jsĐối tượng Global trong Node.jsSắp Tết 2026 Rồi! - Còn bao nhiêu ngày nữa là đến tết 2026?

VietTuts on facebook

Học Lập Trình Online Miễn Phí - VietTuts.Vn
Danh Sách Bài Học

Học Java | Hibernate | Spring
Học Excel | Excel VBA
Học Servlet | JSP | Struts2
Học C | C++ | C#
Học Python
Học SQL

Bài Tập Có Lời Giải

Bài tập Java
Bài tập C
Bài tập C++
Bài tập C#
Bài tập Python
Ví dụ Excel VBA

Câu Hỏi Phỏng Vấn

201 câu hỏi phỏng vấn java
25 câu hỏi phỏng vấn servlet
75 câu hỏi phỏng vấn jsp
52 câu hỏi phỏng vấn Hibernate
70 câu hỏi phỏng vấn Spring
57 câu hỏi phỏng vấn SQL

Scroll back to top

Copyright © 2016 VietTuts.Vn all rights reserved. | Liên hệ | Chính sách - riêng tư | sitemap.html | sitemap_index.xml