日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

node随笔-数据流Stream

發布時間:2024/6/30 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node随笔-数据流Stream 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一. 流(stream)

在 Node.js 中是處理流數據的抽象接口(abstract interface),?stream?模塊提供了基礎的 API 。使用這些 API 可以很容易地來構建實現流接口的對象。

Node.js 提供了多種流對象。 例如,?HTTP 請求?和?process.stdout?就都是流的實例。

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

二. 流的類型

Readable 可讀的流? 例如 fs.createReadStream()

Writable? 可寫的流? 例如 fs.createWriteStream()

Duplex 可讀寫的流 例如 net.socket

Transform?在讀寫過程中可以修改和變換數據的 Duplex 流 例如?zlib.createDeflate()

三.緩沖

Writable 和 Readable流都會將數據存儲到內部的緩沖器buffer中,這些緩沖器可以通過相應的writable._writableState.getBuffer()?或?readable._readableState.buffer?來獲取。

緩沖器的大小取決于傳遞給流構造函數的highWaterMark?選項,對于普通的流,hignWaterMark選項指定了總共的字節數,對于工作在對象模式的流,hignWaterMark指定了對象的總數。

可讀流的實現調用stream.push(chunk)方法時,數據被放到緩沖器中,如果流的消費者沒有調用stream.read()方法,這些數據會始終存在于內部隊列中,直到被消費。

?

四.可寫流 Writable

可寫流是對數據寫入目的地的一種抽象

相關事件:

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

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

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

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

unpipe事件?在 可讀流上調用 stream.unpipe方法,從目標流向中移除當前 Writable時,將會觸發?unpipe事件。

相關的方法

writable.end([chunk], [,encoding], [,callback]) 可選的,需要寫入的數據。對于非對象模式下的流,?chunk?必須是字符串、或?Buffer、或?Uint8Array。對于對象模式下的流,?chunk?可以是任意的 JavaScript 值,除了?null。

在調用了writable.end()之后,在調用writeable.write()會報錯

五.可讀流Readable?streams

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

1.可讀流事實上工作在下面兩種模式之一:flowing 和 paused 。

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

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

所有初始工作模式為paused的Readable流,可以通過以下三種途徑切換為flowing模式:

1.監聽data事件. 2.調用stream.resume()? 3.調用stream.pipe()方法將數據發送到Writable.

可讀流可以從以下三種路徑切換為paused模式:

1.如果不存在管道目標,可以通過stream.paused()實現。

2.如果存在管道目標,可以通過取消監聽data事件,并調用stream.unpipe()方法移除所有管道目標來實現。

可讀流監聽的事件

1.‘’close"事件將在流或其底層資源(比如一個文件)關閉后觸發?!眂lose"?事件觸發后,該流將不會再觸發任何事件。

2.?'data'?事件會在流將數據傳遞給消費者時觸發。當流轉換到 flowing 模式時會觸發該事件。調用?readable.pipe(),?readable.resume()?方法,或為?'data'?事件添加回調可以將流轉換到 flowing 模式。?'data'?事件也會在調用?readable.read()?方法并有數據返回時觸發。

3.end事件將在流中沒有數據可供消費時觸發,?'end'?事件只有在數據被完全消費后?才會觸發?。 可以在數據被完全消費后,通過將流轉換到 flowing 模式, 或反復調用?stream.read()?方法來實現這一點。

4.error事件可以在任何可讀流中實現,通常,這會在底層系統內部從而不能產生數據,或當流的實現試圖傳遞錯誤數據時觸發。

5.readable事件將在流中有數據可供讀取時觸發

readable.isPaused()?方法返回可讀流的當前操作狀態。 該方法主要是在?readable.pipe()?方法的底層機制中用到。大多數情況下,沒有必要直接使用該方法。

readable.pause()?方法將會使 flowing 模式的流停止觸發?'data'?事件, 進而切出 flowing 模式。任何可用的數據都將保存在內部緩存中。

const readable = getReadableStreamSomehow(); readable.on('data', (chunk) => { console.log(`Received ${chunk.length} bytes of data.`); readable.pause(); console.log('There will be no additional data for 1 second.'); setTimeout(() => { console.log('Now data will start flowing again.'); readable.resume(); }, 1000); });

readable.pipe()?綁定一個?Writable?到?readable?上, 將可寫流自動切換到 flowing 模式并將所有數據傳給綁定的?Writable。數據流將被自動管理。這樣,即使是可讀流較快,目標可寫流也不會超負荷(overwhelmed)。

readable.pipe()?方法返回?目標流?的引用

readable.readableHighWaterMark?返回構造該可讀流時傳入的?'highWaterMark'?屬性。

readable.read([size]) 從內部緩沖區中抽出并返回一些數據,如果沒有可讀的數據 則返回null。readable.read()方法默認數據將做為Buffer數據返回,除非已經使用readable.setEncoding()方法設置編碼或流運行在對象模式。

轉載于:https://www.cnblogs.com/xiaowang0808/p/9020650.html

總結

以上是生活随笔為你收集整理的node随笔-数据流Stream的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。