nodejs中大量的api與流有關,曾經看到公司的一些大神的node代碼,實現一個接口只須要pipe一下另外一個java接口就能夠了。簡單的一行代碼實在讓人困惑。做爲小白的本身一臉懵逼卻又不敢問,由於根本不知道從何問起。如今終於經過學習,也能對流說出個123,但願和你們共同交流。html
流分爲緩衝模式和對象模式,緩衝模式只能處理buffer或字符串,對象模式能夠處理js對象。流又分爲四種類型:可讀流、可寫流、雙工流和轉換流。後兩種實際上是對可讀和可寫流的應用。因此我想先聊聊可讀流和可寫流。java
可讀流有兩種模式,並隨時能夠轉換,咱們能夠經過監聽可讀流的事件來操做它。node
兩種模式(引用自node中文網的描述):
一、流動模式:可讀流自動讀取數據,經過EventEmitter接口的事件儘快將數據提供給應用。
二、暫停模式:必須顯式調用stream.read()方法來從流中讀取數據片斷。api
暫停模式切換到流動模式的api有:
一、監聽「data」事件
二、調用 stream.resume()方法
三、調用 stream.pipe()方法將數據發送到可寫流
緩存
流動模式切換到暫停模式的api有:
一、若是不存在管道目標,調用stream.pause()方法
二、若是存在管道目標,調用 stream.unpipe()並取消'data'事件監聽
bash
可讀流事件:'data','readable','error','close','end'函數
可寫流相對較爲簡單,咱們也能夠經過監聽它的事件來操做它。學習
可寫流事件: 'close','drain','error','finish','pipe','unpipe'ui
我以一個簡單的例子描述一個流最多見的場景,談談對這個過程的理解。例子就是:我要讀取一個文件,而後把它的內容寫到另外一個文件(固然是用「流」的api,而不是用‘fs’模塊的api)。 spa
那麼這張圖對應到代碼是什麼樣的呢:
let fs = require('fs');
//建立可讀可寫流
let rs = fs.createReadStream('./1.txt');
let ws = fs.createWriteStream('./2.txt');
//監聽‘data’事件,開啓流動模式
rs.on('data',function (data) {
//對應圖中的可寫流true和false
let flag = ws.write(data);
if(!flag){
//若是可寫流返回false,咱們應當中止讀取,以免消耗過多內存
rs.pause();
}
});
//對應圖中的drain事件
ws.on('drain',function () {
//從新開啓流動模式
rs.resume();
});
//使用可讀流的暫停模式
function read() {
let data = rs.read()
let flag = ws.write(data);
if(flag){
read()
}
}
rs.on('readable',function(){
read()
})
ws.on('drain',function () {
read()
});
複製代碼
可讀和可寫流的用法和api還有不少,這裏只是簡單的梳理了一下基本過程,若是有描述不許確的地方還請你們在評論區多指正。