node.js stream使用整理

什麼是流?

流是node.js最重要的組成和設計模式之一,能夠作到實時處理。
javascript

流的重要性

讀取一個文件能夠分爲兩種方式
一、讀取所有文件到緩存後,再處理。 這樣的問題是:一、須要的時間須要加倍。二、內存可能溢出。
二、經過流邊讀取,邊處理。這樣能夠提高時間效率,下降空間佔用。
java

因此要實現大文件的高效率讀取,防止內存爆掉,用流是頗有必要,而不光如此,像是網絡請求通訊等實時性高的,若是等服務器組合好再返回數據,那麼時效性太差,而流恰好能夠處理這個場景,服務器能夠邊產生數據邊返回。
而流的好處不光如此,流還具備組合性
什麼是流的組合性?
流具備pipe方法,這個方法的做用是把不一樣的處理單元鏈接起來,組合成一個流的管道,好比讀取一個文件,在第一個流裏面讀取,而後經過pipe方法傳送給第二個流的處理單元壓縮,再傳送給第三個流的處理單元加密,pipe在這其中的做用就是把這些流連接起來,組成一個管道。node

流的分類

可讀流

一個可讀流表明一個數據源,在node.js中,可使用stream模塊提供的Readable抽象類來實現。
設計模式

從流中如何讀取數據?

獲取數據的方式有兩種:一、非流動模式。二、流動模式。
緩存

非流動模式:

從可讀流中讀取數據的默認方式都是添加一個對於readable事件的監聽器,在讀取新的數據時進行通知,而後在一個循環裏讀取全部的數據,直到內部的緩存被清空,這個能夠經過read()方法來實現,該方法能同步讀取緩存中的數據,並返回一個buffer或者string對象表示數據塊,read()方法的使用以下:服務器

readable.read()
複製代碼

使用該方法,數據是根據須要從流中被拉取得。
數據能夠在readable的事件監聽器中被讀取到,該事件會在新數據可讀時被觸發。當內存中沒有更多數據可讀時,read()方法會返回null,這個時候就必須等待readable事件再次觸發,告訴咱們有新的數據能夠讀取或者等待end事件,告訴咱們整個可讀流已經結束了,二進制狀況下還能夠指定read方法的size值,表示想要讀取數據的大小,在實現網絡協議(能夠讀取數據的頭部信息,獲取消息類型)或者解析特定數據格式的時候,這一點很是有用。在二進制模式下,能夠經過調用setEncoding(),給可讀流設置一個有效的編碼格式,從而直接讀取到字符串而不是buffer值
網絡

流動模式:

給data事件添加一個監聽器,這就是流動模式的流讀取,該模式下數據不是經過read來拉取,相反只要流中數據可讀,便會當即推送到data事件的監聽器。
這裏須要注意的是:流動模式繼承了舊版本(stream1)的流接口,其在控制數據流上靈活性不大(不能按需讀取數據),而在stream2中流動模式不是默認的工做模式,若是想啓用,須要爲data事件添加監聽器或者顯式調用resume方法。能夠經過pause()方法臨時組織data事件,將接受的數據臨時存放到內部緩存中,可是不會致使流轉回非流動模式。
this

實現可讀流

須要建立一個新的類,繼承stream.Radable的原型,具體的流實例必須提供對於_read方法的實現。一個流的實現主要在於,生產數據和消費數據之間的協調,當生產過快的時候,緩存不足須要節制生產,等待消費數據消費掉緩存,不然會形成數據丟失
Readable類內部會調用_read方法,緊接着會調用push方法將數據填充到緩存中
何時能夠觸發_read方法? 一、註冊data事件。二、read()。三、resume()。以上三種只能夠觸發一次_read(),以後的read須要this.push觸發編碼

可寫流

雙向流

變換流

相關文章
相關標籤/搜索