Node.js Stream(流)

來源:互聯網
上載者:User

標籤:

 

Stream 是一個抽象介面,Node 中有很多個物件實現了這個介面。例如,對http 伺服器發起請求的request 對象就是一個 Stream,還有stdout(標準輸出)。

Node.js,Stream 有四種流類型:

  • Readable - 可讀操作。

  • Writable - 可寫操作。

  • Duplex - 可讀可寫操作.

  • Transform - 操作被寫入資料,然後讀出結果。

所有的 Stream 對象都是 EventEmitter 的執行個體。常用的事件有:

  • data - 當有資料可讀時觸發。

  • end - 沒有更多的資料可讀時觸發。

  • error - 在接收和寫入過程中發生錯誤時觸發。

  • finish - 所有資料已被寫入到底層系統時觸發。

本教程會為大家介紹常用的流操作。

從流中讀取資料

建立 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(流)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.