Stream是一個抽象介面,Node中有很多物件實現了這個介面。例如,對http伺服器發起請求的request物件就是一個Stream,還有stdout(標準輸出)。
Node.js,Stream有四種流型別:
- Readable--可讀操作。
- Writable--可寫操作。
- Duplex--可讀可寫操作。
- Transform--操作被寫入資料,然後讀出結果。
所有的Stream物件都是EventEmitter的實列。常用的事件有:
- data--當有資料可讀時觸發。
- end--沒有更多的資料可讀時觸發。
- error--在接收和寫入過程中發生錯誤時觸發。
- finish--所有資料已被寫入到底層系統時觸發。
1、Readable
可讀流的例子包括:
以fs為例建立一個可讀流:
fs.createReadStream(path,[options]);
- path --- 要讀取檔案的路徑
- options --- 一個陣列物件包含:
flags:指定用什麼模式開啟,“w”代表寫,“r”代表讀。
endoding:編碼格式“utf8","ascii","base64"三種格式,預設“utf8”。
highWaterMark:水位線
autoClose:為true時(預設行為),對錯誤或結束的檔案描述符將自動關閉,為 false時,檔案描述符將不會被關閉,即使他們報錯了。
start:開始讀取的位元組位置
end:結束讀取的位元組位置。
建立一個1.txt檔案,內容:asdfasd
同一目錄下建立一個js檔案
let fs = require("fs");
let path = require("path");
let readable = fs.createReadStream(path.join(__dirname,"./1.txt"),{
flags: 'r',
encoding: 'utf8',
autoClose: true,
mode: "0666",
});
readable.on('data', function(chunk){
console.log( chunk.length, chunk);
});
//7 'asdfasd'複製程式碼
可讀的流有兩種模式:
流動模式:資料會自動從來源流出,直到來源資料耗盡。
暫停模式:你得通過stream.read()主動去要資料,不要資料就一直等在那。
可讀流在建立時都是暫停模式。暫停模式和流動模式可以相互轉換。
2、Writable
可寫流的例子包括了:
例如:
let fs = require("fs");
let path = require("path");
let writable = fs.createWriteStream(path.join(__dirname,"./1.txt"),{
flags: 'w',
encoding: 'utf8',
autoClose: true,
mode: "0666",
});
writable.on('finish', function(){
console.log('寫入完成');
process.exit(0);
});
writable.write('node修煉中...', 'utf8');
writable.end();
//寫入完成複製程式碼
3、Duplex
Duplex 流的例項包括了:
4、Transform
變換流的例項包括: