天天看點

Node.js資料流Stream之Readable流和Writable流

一、前傳

stream在很多語言都會有,當然node.js也不例外。資料流是可讀、可寫、或即可讀又可寫的記憶體結構。node.js中主要包括readable、writable、duplex(雙工)和transform(變換)流。但是在學這些之前先學會util子產品中的一個從其他對象繼承的功能.

util子產品提供了util.inherits()方法來允許你建立一個繼承另一個對象的prototype(原形)方法的對象。當建立一個新對象時,prototype方法自動被使用。

util.inherits(constructor,superconstructor)原形constructor被設定為原形superconstructor,并在一個新的對象被建立時執行。可以通過使用constructor.super_屬性從自定義對象的構造函數通路supercontructor.

二、readable流

有的前傳util子產品從其他對象繼承的功能的了解,readable就很好了解了.主要它包含以下方法和事件。

1.事件:

readable:在資料塊可以從流中讀取的時候發出。

data:類似readable,不同之處在于,當資料的事件處理程式被連接配接時,流被轉變成流動的模式,并且資料處理程式被連續的調用,直到所有資料都被用盡

end:當資料不再被提供時由流發出

close:當底層資源,如檔案,已關閉時發出。

error:在接收資料中出錯是發出。

2.方法:

read([size]):從流中讀資料.資料可以是string、buffer、null(下面代碼會有),當指定size,那麼隻讀僅限于那個位元組數

setencoding(encoding):設定read()請求讀取傳回string時使用的編碼

pause():暫停從該對象發出的data事件

resume():恢複從該對象發出的data事件

pipe(destination,[options]):把這個流的輸出傳輸到一個由deatination(目的地)指定的writable流對象。options是一個js對象.例如:{end:true}當readable結束時就結束writable目的地。

unpipe([destination]):從writale目的地斷開這一對象。

3.demo:

上面定義了一個通過util.inherits()繼承readable流的對象,從輸出結果可以看到輸出了3個字元串,但readable事件确執行了4次,其實前面也有寫,read()可以是null,最後是push(null)了。

三、writable流

有讀就會有寫,畢竟是可逆的,它和readable一樣也有一些事件和方法

1.方法

write(chunk,[encoding],[callback]):将資料寫入流。chunk(資料塊)中包含要寫入的資料,encoding指定字元串的編碼,callback指定當資料已經完全重新整理時執行的一個回調函數。如果成功寫入,write()傳回true.

end([chunk],[encoding],[callback]):與write()相同,它把writable對象設為不再接受資料的狀态,并發送finish事件。

2.事件

drain:在write()調用傳回false後,當準備好開始寫更多資料時,發出此事件通知螢幕。

finish:當end()在writable對象上調用,是以資料被重新整理,并不會有更多的資料被接受時觸發

pipe:當pipe()方法在readable流上調用,已添加此writable為目的地時發出

unpipe:當unpipe()方法被調用,以删除writable為目的地時發出。

3.demo

四、把readable流用管道輸送到writable流

上面也介紹了readable流pipe()方法,這個主要是來測試

繼續閱讀