標籤:
Stream 是一個抽象介面,Node 中有很多個物件實現了這個介面。例如,對http 伺服器發起請求的request 對象就是一個 Stream,還有stdout(標準輸出)。
Node.js,Stream 有四種流類型:
所有的 Stream 對象都是 EventEmitter 的執行個體。常用的事件有:
本教程會為大家介紹常用的流操作。
從流中讀取資料
建立 input.txt 檔案,內容如下:
Stream 是一個抽象介面。
建立 main.js 檔案, 代碼如下:
var fs = require("fs");var data = ‘‘;// 建立可讀流var readerStream = fs.createReadStream(‘input.txt‘);// 設定編碼為 utf8。readerStream.setEncoding(‘UTF8‘);// 處理流事件 --> data, end, and errorreaderStream.on(‘data‘, function(chunk) { data += chunk;});readerStream.on(‘end‘,function(){ console.log(data);});readerStream.on(‘error‘, function(err){ console.log(err.stack);});console.log("程式執行完畢");
以上代碼執行結果如下:
程式執行完畢Stream 是一個抽象介面。
寫入流
建立 main.js 檔案, 代碼如下:
var fs = require("fs");var data = ‘Stream 是一個抽象介面‘;// 建立一個可以寫入的流,寫入到檔案 output.txt 中var writerStream = fs.createWriteStream(‘output.txt‘);// 使用 utf8 編碼寫入資料writerStream.write(data,‘UTF8‘);// 標記檔案末尾writerStream.end();// 處理流事件 --> data, end, and errorwriterStream.on(‘finish‘, function() { console.log("寫入完成。");});writerStream.on(‘error‘, function(err){ console.log(err.stack);});console.log("程式執行完畢");
以上程式會將 data 變數的資料寫入到 output.txt 檔案中。代碼執行結果如下:
$ node main.js 程式執行完畢寫入完成。
查看 output.txt 檔案的內容:
$ cat output.txt Stream 是一個抽象介面
管道流
管道提供了一個輸出資料流到輸入資料流的機制。通常我們用於從一個流中擷取資料並將資料傳遞到另外一個流中。
如上面的圖片所示,我們把檔案比作裝水的桶,而水就是檔案裡的內容,我們用一根管子(pipe)串連兩個桶使得水從一個桶流入另一個桶,這樣就慢慢的實現了大檔案的複製過程。
以下執行個體我們通過讀取一個檔案內容並將內容寫入到另外一個檔案中。
設定 input.txt 檔案內容如下:
Stream 是一個抽象介面管道流操作執行個體
建立 main.js 檔案, 代碼如下:
var fs = require("fs");// 建立一個可讀流var readerStream = fs.createReadStream(‘input.txt‘);// 建立一個可寫流var writerStream = fs.createWriteStream(‘output.txt‘);// 管道讀寫操作// 讀取 input.txt 檔案內容,並將內容寫入到 output.txt 檔案中readerStream.pipe(writerStream);console.log("程式執行完畢");
代碼執行結果如下:
$ node main.js 程式執行完畢
查看 output.txt 檔案的內容:
$ cat output.txt Stream 是一個抽象介面管道流操作執行個體
鏈式流
鏈式是通過串連輸出資料流到另外一個流並建立多個對個流操作鏈結的機制。鏈式流一般用於管道操作。
接下來我們就是用管道和鏈式來壓縮和解壓檔案。
建立 compress.js 檔案, 代碼如下:
var fs = require("fs");var zlib = require(‘zlib‘);// 壓縮 input.txt 檔案為 input.txt.gzfs.createReadStream(‘input.txt‘) .pipe(zlib.createGzip()) .pipe(fs.createWriteStream(‘input.txt.gz‘)); console.log("檔案壓縮完成。");
代碼執行結果如下:
$ node compress.js 檔案壓縮完成。
執行完以上操作後,我們可以看到目前的目錄下產生了 input.txt 的壓縮檔 input.txt.gz。
接下來,讓我們來解壓該檔案,建立 decompress.js 檔案,代碼如下:
var fs = require("fs");var zlib = require(‘zlib‘);// 解壓 input.txt.gz 檔案為 input.txtfs.createReadStream(‘input.txt.gz‘) .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream(‘input.txt‘)); console.log("檔案解壓完成。");
代碼執行結果如下:
$ node decompress.js 檔案解壓完成。
Node.js Stream(流)