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.