Nodejs 流的操作
Stream(流)
簡介
Stream是一個抽象介面,所有的Stream都是EventEmitter的例項,Stream有四種類型:
- Readable 可讀
- Writeable 可寫
- Duplex 可讀可寫操作
- Transform 操作被寫入資料、然後讀出結果
常用事件
- data—有資料可讀時觸發
- end—沒有資料可讀時觸發
- error—在接受或寫入過程中發生錯誤
- finish—所有資料被寫入到底層系統時觸發
讀/寫資料
讀取
例項
var fs = require("fs");
var data = '';
var
rs.setEncoding('UTF8');
rs.on('data',function (content) {
data += content;
});
rs.on('end',function () {
console.log(data);
});
rs.on('error',function (err) {
console.log(err.stack);
});
console.log("over");
執行結果:
var readerStream = fs.createReadStream('路徑');
讀取檔案內容:
如果可讀:data = data+content(讀取到的檔案內容);
如果無資料可讀:輸出data
寫入
例項
var fs = require("fs");
var data = '一個人至少擁有一個夢想,有一個理由去堅強。心若沒有棲息的地方,到哪裡都是在流浪。';
var ws = fs.createWriteStream('E:/for_file/6.txt');
ws.write(data,'UTF8');//按照utf8編碼寫入資料
ws.end();//標記末尾
ws.on('finish',function () {
console.log("over");
});
ws.on('error',function (e) {
console.log(e.stack);
});
console.log("finish");
執行結果:
createWriteStream()按照路徑建立一個檔案
監聽finish和error事件
管道流
- 首先執行 readbable.pipe(writable),將 readable 與 writable 對接上
- 當 readable 中有資料時,readable.emit('data'),將資料寫入 writable
- 如果 writable.write(chunk) 返回 false,則進入 pause 模式,等待 drain 事件觸發
- drain 事件全部觸發後,再次進入 flow 模式,寫入資料
- 不管資料寫入完成或發生中斷,最後都會呼叫 unpipe()
- unpipe() 呼叫 Readable.prototype.unpipe(),觸發 dest 的 unpipe 事件,清理相關資料
例項
var fs = require("fs");
var rs = fs.createReadStream("E:/for_file/6.txt");
var ws = fs.createWriteStream("E:/for_file/7.txt");
rs.pipe(ws);
console.log("over");
執行結果:
鏈式流
連線readerStream和writeStream並進行操作
例項
var fs = require('fs');
var zlib = require('zlib');
fs.createReadStream('E:/for_file/6.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('E:/for_file/7.txt.gz'));
console.log("ovre");
執行結果:
var fs = require("fs");
var zlib = require('zlib');
// 壓縮 input.txt 檔案為 input.txt.gz
fs.createReadStream('E:/for_file/6.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('E:/for_file/7.txt'));
console.log("檔案解壓完成。");
執行結果: