#########################################################################介紹Node.js Stream(流)Stream 是一個抽象介面,Node 中有很多對象實現了這個介面。例如,對http 伺服器發起請求的request ...
#########################################################################介紹
Node.js Stream(流)
Stream 是一個抽象介面,Node 中有很多對象實現了這個介面。例如,對http 伺服器發起請求的request 對象就是一個 Stream,還有stdout(標準輸出)。
Node.js,Stream 有四種流類型:
• Readable - 可讀操作。
• Writable - 可寫操作。
• Duplex - 可讀可寫操作.
• Transform - 操作被寫入數據,然後讀出結果。
所有的 Stream 對象都是 EventEmitter 的實例。常用的事件有:
• data - 當有數據可讀時觸發。
• end - 沒有更多的數據可讀時觸發。
• error - 在接收和寫入過程中發生錯誤時觸發。
• finish - 所有數據已被寫入到底層系統時觸發。
#############################################################################
從流中讀取數據
read_source.txt:love A
####main.js
var fs = require('fs'); var data = ''; // 創建可讀流 var readStream = fs.createReadStream('read_source.txt'); // 設置編碼為 utf8 readStream.setEncoding('UTF8'); // 處理流事件 --> data, end, and error readStream.on('data', function (chunk) { data += chunk; }); readStream.on('end', function () { console.log(data); }); readStream.on('error', function (err) { console.log(err.stack) }); console.log('程式執行完畢');
執行結果:
程式執行完畢
love A
#############################################################################
寫入流
var fs = require('fs'); var data = 'love A'; // 創建寫入流,寫入到文件 output.txt 中 var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 編碼寫入數據 writerStream.write(data, 'utf8'); // 標記文件末尾 writerStream.end(); // 處理流事件 --> finish and error writerStream.on('finish', function () { console.log('寫入完畢'); }); writerStream.on('error', function (err) { console.log(err.stack); }); console.log('程式執行完畢');
執行結果:
程式執行完畢
寫入完畢
###註意
創建寫入流的時候,文件存在會覆蓋原來文件。後面的例子也一樣,是文件的部分,現在還沒有學到那裡,如果需要如何追加內容,按照Java的思路查找api文檔
#############################################################################
管道流
管道提供了一個輸出流到輸入流的機制。通常我們用於從一個流中獲取數據並將數據傳遞到另外一個流中。
如上面的圖片所示,我們把文件比作裝水的桶,而水就是文件里的內容,我們用一根管子(pipe)連接兩個桶使得水從一個桶流入另一個桶,這樣就慢慢的實現了大文件的複製過程。
以下實例我們通過讀取一個文件內容並將內容寫入到另外一個文件中。
####實例
var fs = require('fs'); var readStream = fs.createReadStream('read_source.txt'); var writerStream = fs.createWriteStream('output2.txt'); // 管道讀寫操作 // 讀取 read_source.txt 文件內容,並將內容寫入到 output2.txt中 readStream.pipe(writerStream); console.log('程式執行完畢');
#############################################################################
鏈式流
鏈式是通過連接輸出流到另外一個流並創建多個流操作鏈的機制。鏈式流一般用於管道操作。
接下來我們就是用管道和鏈式來壓縮和解壓文件。
###壓縮
創建 compress.js 文件, 代碼如下:
var fs = require('fs'); var zlib = require('zlib'); // 壓縮 read_source.txt 成 read_source.txt.gz var readStream = fs.createReadStream('read_source.txt'); var gzip = zlib.createGzip(); var writeStream = fs.createWriteStream('read_source.txt.gz'); readStream.pipe(gzip); gzip.pipe(writeStream); console.log('文件壓縮完成');
###解壓
執行完以上操作後,我們可以看到當前目錄下生成了 input.txt 的壓縮文件 input.txt.gz。
接下來,讓我們來解壓該文件,創建 decompress.js 文件,代碼如下:
var fs = require('fs'); var zlib = require('zlib'); // 解壓 read_source.txt.gz 成 depress.txt var readStream = fs.createReadStream('read_source.txt.gz'); var gunzip = zlib.createGunzip(); var writeStream = fs.createWriteStream('depress.txt'); readStream.pipe(gunzip); gunzip.pipe(writeStream); console.log('文件解壓完成');
內容來自:http://www.runoob.com/nodejs/nodejs-stream.html +我的學習理解