Node.js流


什麼是流?

流是可以從一個源讀取或寫入資料到連續的目標物件。在Node.js,有四種型別的資料流。

  • Readable - 其是用於讀操作。

  • Writable - 用在寫操作。

  • Duplex - 其可以用於讀取和寫入操作。

  • Transform - 輸出基於輸入的地方進行計算的一種雙相流。

每種型別的流是一個EventEmitter範例,並丟擲的時代不同的範例幾個事件。例如,一些常用的事件是:

  • data - 當有資料可讀取此事件。

  • end - 當沒有更多的資料讀取此事件被觸發。

  • error - 當有任何錯誤或接收資料寫入此事件。

  • finish - 當所有資料已重新整理到底層系統觸發此事件

本教學將讓您了解關於資料流的常用操作。

從流中讀取

建立一個名為input.txt的文字檔案有以下內容

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

建立一個js檔案名為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");

現在執行main.js看到的結果:

$ node main.js

驗證輸出

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

寫入流

建立一個js檔案名為main.js的檔案,裡面有如下程式碼:

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

現在執行main.js看到的結果:

$ node main.js

驗證輸出

Program Ended
Write completed.

現在開啟在當前目錄中建立output.txt檔案,驗證output.txt檔案中有以下內容。

Simply Easy Learning

管道流

管道是我們提供一個流的輸出作為輸入到另一個流的機制。它通常被用於從一個流中獲取資料,並通過該流輸出到另一個流。沒有對管道的操作沒有限制。現在,我們將展示一個管道從一個檔案中讀取和寫入到另一個檔案的例子。

建立一個js檔案名為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");

現在執行main.js看到的結果:

$ node main.js

驗證輸出

Program Ended

在當前目錄開啟所建立的output.txt檔案,並驗證output.txt檔案中有以下內容。

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

鏈式流

鏈式是一個機制,一個流的輸出連線到另一個流,並建立一個鏈多流操作。它通常用於管道的操作。現在,我們將使用管道和連結先壓縮檔案,然後解壓縮。

建立一個js檔案名為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.");

現在執行main.js看到結果:

$ node main.js

驗證輸出

File Compressed.

你會發現,input.txt檔案已經被壓縮,並在當前目錄下建立的檔案input.txt.gz。現在,讓我們嘗試使用下面的程式碼進行解壓縮同一個檔案。

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

現在執行main.js看到結果:

$ node main.js

驗證輸出

File Decompressed.