国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

NodeAPI學習之Stream

laznrbfe / 2121人閱讀

摘要:回調函數將接收到一個對象。要禁止這一默認行為,選項應該指定為。一般來說,建議開發人員避免使用事件和方法,使用或事件代替。事件在寫入數據出錯或者使用管道出錯時觸發,事件發生時,回調函數僅會接收到一個參數。注意事件發生時,流并不會關閉。

Stream

流可以是可讀的、可寫的、或者是可讀寫的。所有的流都是EventEmitter的實例。

對象模式

所有使用Node.js API創建的流對象都只能操作strings和Buffer(或Unit8Array)。但是一些第三方流的實現,能夠操作其他類型的javascript值(除了null,它在流處理中有特殊意義),這種類型的流被認為是工作在‘對象模式’

緩沖

Writable和Readable流都會將數據存儲到內部的緩存(buffer)中

可讀流的實現調用stream.push(chunk)時,數據被放到緩存中。如果流的消費者沒有調用stream.read()方法,就會始終存在于內部隊列中,直到被消費。緩存的大小取決于傳遞給流構造函數的highWaterMark選項。當內部可讀緩存的大小達到highWaterMark指定的閥值時,流會暫停從底層資源讀取數據,直到當前緩存的數據被消費。

可寫流通過反復調用writable.write(chunk)方法將數據放到緩存。當內部可寫緩存的總大小小于highWaterMark指定的閥值時,調用writable.write()返回true,一旦達到或超過highWaterMark,調用writable.write()返回false,此時應該停止向流中寫入數據,直到drain事件被觸發。

可讀的流Readable

例如fs.createReadStream()

可讀流(Readable streams)是對提供數據的源頭(source)的抽象

兩種工作模式:flowing(流動模式)和paused(暫停模式)

flowing模式下:可讀流自動從系統底層讀取數據,并通過EventEmitter()接口的事件盡快將數據提供給應用。

paused模式下:必須顯式調用stream.read()方法來從流中讀取數據片段。

初始工作模式都是paused的Readable流,可以通過三種途徑切換到flowing模式。

監聽data事件

調用stream.resume()方法

調用stream.pipe()方法將數據發送到Writable

可讀流可以通過兩種方式切換到paused

如果可讀流沒有橋接可寫流成為管道,調用stream.pause()實現

如果可讀流橋接了若干可寫流組成了管道,通過取消data事件監聽,并調用stream.unpipe()方法移除所有管道目標實現

close事件:

在流或其底層資源(比如一個文件)關閉后觸發。事件觸發后,該流將不會再觸發任何事件。

data事件:

在流將數據傳遞給消費者時觸發。當流轉換到flowing模式時會觸發該事件。處理器的參數是Buffer對象,如果你調用了Readable的setEncoding(encoding)方法,處理器的參數就是String對象。

end事件:

在流中再沒有數據可供消費時觸發。

const readable = readableStreamSomehow()
readable.on("data", (chunk) => {
    console.log(`received ${chunk.length} bytes of buffer data.`)
})
readable.on("end", () => {
    console.log("no more data.")
})

error事件:

通常底層系統內部出錯從而不能產生數據,或當流的實現試圖傳遞錯誤數據時發生。回調函數將接收到一個Error對象。

readable事件:

將在流中有數據可供讀取時觸發。stream.read()返回可用的數據。

const readable = readableStreamSomehow()
readable.on("readable", () => {
    // 有一些數據可讀
})

在到達流數據尾部時,該事件也會觸發。觸發順序在end事件之前。stream.read()返回null

// foo.txt是一個空文件
const fs = require("fs")
const rr = fs.createReadStream("foo.txt")
rr.on("readable", () => {
    console.log("readable", rr.read) // null
})
rr.on("end", () => {
    console.log("end") // end
})

readable.pipe(destination[,options])

綁定一個writable到readable上,形成一個管道,并將所有數據傳給綁定的writable。可以在單個可讀流上綁定多個可寫流。

const r = fs.createReadStream("file.txt")
const z = zlib.createGzip()
const w = fs.createWriteStream("file.txt.gz")
r.pipe(z).pipe(w)

默認情況下,當源可讀流觸發end事件時,目標流也會調用stream.end()方法從而結束寫入。要禁止這一默認行為,end選項應該指定為false。

reader.pipe(writer, {end: false})
reader.on("end", () => {
    writer.end("goodbye)
})

如果可讀流在處理時發生錯誤,目標可寫流不會自動關閉。 如果發生錯誤,需要手動關閉所有流以避免內存泄漏。

一般來說,建議開發人員避免使用"readable"事件和readable.read()方法,使用readable.pipe()或"data"事件代替。

writable.unpipe([destination])

readable.unpipe()方法將之前通過stream.pipe()方法綁定的流分離

如果 destination 沒有傳入, 則所有綁定的流都會被分離.

如果傳入 destination, 但它沒有被pipe()綁定過,則該方法不作為.

可寫的流Writable

例如fs.createWriteStream()

Writable streams是destination的一種抽象,這種destination允許數據寫入

close事件:

在流或者底層資源(比如一個文件)關閉后觸發,事件觸發后該流將不會再觸發任何事件。

drain事件`:

如果調用stream.write(chunk)方法返回false,流將在適當的時機觸發drain事件,這時才可以繼續向流中寫入數據。

error事件`:

在寫入數據出錯或者使用管道(pipe)出錯時觸發,事件發生時,回調函數僅會接收到一個Error參數。注意:error事件發生時,流并不會關閉。

finish事件

在調用了stream.end()方法,且緩沖區數據都已經傳給底層系統之后,finish事件將被觸發。

pipe事件

在可讀流上調用stream.pipe()方法,并在目標流向中添加當前可寫流時,將會在可寫流上觸發pipe事件。

const writer = writeStreamSomehow()
const reader = readStreamSomehow()
writer.on("pipe", (src) => {
    console.log("piping into the writer")
    assert.equal(src, reader)
})
reader.pipe(writer)

writable.end([chunk][,encoding][,callback])

調用writable.end()方法表明接下來沒有數據要被寫入writable,通過傳入可選的chunk和encoding參數,可以在關閉流之前再寫入一段數據。如果傳入了可選的callback函數,將作為finish事件的回掉函數。

在調用了stream.end()方法之后,再調用stream.write()方法會導致錯誤。

// 寫入hello 并用world結束寫入
const file = fs.createWriteStream("example.txt)
file.write("hello, ")
file.end("wrold!)
// 后面不允許再寫入數據

writable.write(chunk[,encoding][,callback])

向流中寫入數據,并在數據處理完成后調用callback。我們建議,一旦write()返回false,在"drain"事件觸發前,不能寫入任何數據塊。

writable.uncork()

可讀寫的流Duplex

例如net.Socket()

在讀寫過程中可以修改和變換數據的Duplex流Transform

例如zlib.createDeflate()

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89605.html

相關文章

  • NodeAPI習之Buffer

    摘要:與字符編碼通過指定的編碼進制,可以在與普通的字符串之間轉換。中文中文通常用于實例數組的排序。有點像方法合并截斷為的長度,缺少的部分會用補充,是一個返回,是一個支持的字符編碼返回,創建并返回一個形式的迭代器,如果與具有完全相同的字節就返回 Buffer 可以在TCP流或者文件系統操作等場景中處理二進制數據流。 Buffer實例類似于整數數組,但是Buffer大小固定、且在V8堆外分配物理...

    Integ 評論0 收藏0
  • node 核心模塊習之 Buffer

    摘要:核心模塊學習之何為在引入之前,沒有能讀取和操作二進制數據流的機制,作為引入,以便能和網絡流文件流等進行交互。返回值寫入的實際大小,沒有足夠的空間保存,只會寫入一部分。返回值實際存入的字節數。參考文章一進階核心模塊常用使用總結 node 核心模塊學習之Buffer 何為 Buffer 在ES6引入 TypeArray 之前,JS沒有能讀取和操作二進制數據流的機制,Buffer 作為 No...

    soasme 評論0 收藏0
  • 【搶先領】《React 習之道》我們翻譯了一本最簡單,且最實用的 React 實戰教程……

    摘要:學習之道簡體中文版通往實戰大師之旅掌握最簡單,且最實用的教程。前言學習之道這本書使用路線圖中的精華部分用于傳授,并將其融入一個獨具吸引力的真實世界的具體代碼實現。完美展現了的優雅。膜拜的學習之道是必讀的一本書。 《React 學習之道》The Road to learn React (簡體中文版) 通往 React 實戰大師之旅:掌握 React 最簡單,且最實用的教程。 showIm...

    oneasp 評論0 收藏0
  • less習之Bootstrap(按鈕篇)

    摘要:學習之按鈕篇如我上一篇學習之里面,介紹了的目錄結構,說明了在這個文件里面,定義了主題色,也包括了按鈕的主題色。偽連接,按鈕的樣式顯示為連接的樣式。接下來的安排,自己寫的文章自己也會去實現它,另外關于的學習也不會停止。 less學習之Bootstrap按鈕篇) 如我上一篇less學習之Bootstrap里面,介紹了Bootstrap的目錄結構,說明了在variables.less這個文件...

    sherlock221 評論0 收藏0
  • java并發編程習之synchronize(一)

    摘要:線程安全問題在并發編程學習之基礎概念提到,多線程的劣勢之一,有個線程安全問題,現在看看下面的例子。那么,該怎么解決呢,很簡單,在方法前加個同步鎖。運行結果如下有兩種情況,是因為看誰先搶占鎖,但是輸出的算法結果是正確的。 線程安全問題 在java并發編程學習之基礎概念提到,多線程的劣勢之一,有個線程安全問題,現在看看下面的例子。 public class NotSafeDemo { ...

    Elle 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<