Streams 流

2018-07-11 09:33 更新
stream 是一個抽象接口,node 中有很對象實現(xiàn)了這個接口。例如,對http 服務(wù)器發(fā)起請求的request 對象就是 一個stream,還有stdout(標(biāo)準(zhǔn)輸出)。Stream 可以是只讀、可寫,也可以同時可讀可寫。所有的Stream 對象 都是EventEmitter 的實例。

Readable Stream 只讀流

一個只讀流有如下方法、成員、和事件。

Event: 'data'

function (data) { }

'data'事件的參數(shù)是Buffer(默認(rèn)情況下),如果調(diào)用過setEncoding()方法,則參數(shù)為一個字符串。

Event: 'end'

function () { }

此事件在流遇到EOF(在TCP 中為FIN)時被觸發(fā),表示該流不會再有數(shù)據(jù)(不會再次觸發(fā)'data'事件)。如果該流 也是可寫流,則它還可以繼續(xù)寫入。

Event: 'error'

function (exception) { }

在收取數(shù)據(jù)出錯時被觸發(fā)。

Event: 'close'

function () { }

內(nèi)部的文件描述符被關(guān)閉時被觸發(fā),并不是所有的流都會觸發(fā)此事件。(例如,一個進(jìn)入的(incoming)HTTP 請 求將不會觸發(fā)'close'事件)。

Event: 'fd'

function (fd) { }

當(dāng)數(shù)據(jù)流接收到文件描述符信息時觸發(fā)該事件(一個文件數(shù)據(jù)流包含兩部分信息:文件描述符信息和文件的數(shù) 據(jù)信息)。本事件只支持Unix 數(shù)據(jù)流,其他類型的流不會觸發(fā)該事件。

stream.readable

一個布爾值,默認(rèn)為true。當(dāng)遇到錯誤或流讀到結(jié)尾或者調(diào)用destory()函數(shù)后,該值被設(shè)置為false。

stream.setEncoding(encoding)

該函數(shù)設(shè)置data 事件返回字符串而不是Buffer 對象。編碼類型可以設(shè)置為"utf8","ascii"或"base64"。

stream.pause()

暫停觸發(fā)data 事件。

stream.resume()

恢復(fù)觸發(fā)'data'事件。

stream.destroy()

關(guān)閉內(nèi)部的文件描述符。這樣該流將不會再觸發(fā)任何事件。

Writable Stream 可寫流

一個可寫流具備以下方法、成員、和事件。

Event: 'drain'

function () { }

在一個wrire() 方法被調(diào)用并返回false 后觸發(fā),表明可以安全的再次寫入該stream。

Event: 'error'

function (exception) { }

在異常發(fā)生赤錯誤時被觸發(fā)。

Event: 'close'

function () { }

當(dāng)?shù)讓拥奈募枋龇呀K止時發(fā)出。

stream.writeable

一個boolean 值,缺省為true ,但是在一個'error'產(chǎn)生或是end() / destroy() 被調(diào)用后,會變?yōu)閒alse 。

stream.write(string, encoding='utf8', [fd])

使用指定的編碼將字符串字符串寫入到流中。如果字符串已被刷新到內(nèi)核緩沖區(qū),返回true。返回false 則表明 內(nèi)核緩沖區(qū)已滿,數(shù)據(jù)將在未來被發(fā)送出去。'drain'事件用來通知內(nèi)核緩沖區(qū)何時為空。此方法的默認(rèn)編碼為 'utf8'。

如果指定了可選參數(shù)fd,它將被當(dāng)做一個文件描述符并通過流來發(fā)送。它只支持UNIX 流,否則會被忽略且沒 有任何提示。當(dāng)用這種方式發(fā)送文件描述符時,在流清空之前關(guān)閉文件描述符可能導(dǎo)致發(fā)送出非法的描述符。

stream.write(buffer)

同上,除了使用一個原始緩沖區(qū)。

stream.end()

通過EOF 或FIN 來終止流。

stream.end(string, encoding)

根據(jù)指定的編碼發(fā)送字符串,并通過EOF 或FIN 來終止流。這對于減少發(fā)送數(shù)據(jù)包的數(shù)量是非常有用的。

stream.end(buffer)

同上,但使用一個緩沖區(qū)。

stream.destroy()

終止底層的文件描述符,此后流不再發(fā)出任何事件。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號