stream(
流)是一種在 node.js 中處理流式資料的抽象介面。
基本上所有的流都繼承了event介面。
node.js 中有四種基本的流型別:
可寫流和可讀流都會在乙個內部的緩衝器中儲存資料。快取的資料量是有限的,會有乙個閥門值。
1、可讀流
當呼叫 stream.push(chunk) 時,資料會被緩衝在可讀流中。 如果流的消費程式沒有呼叫 stream.read(),則這些資料會停留在內部佇列中,直到被消費。一旦內部的可讀緩衝的總大小達到指定的閾值時。流會暫時停止從底層資源讀取資料,直到當前緩衝的資料被消費。
怎麼樣算消費?
2、可寫流
當反覆地呼叫 writable.write(chunk) 方法時,資料會被緩衝在可寫流中。 當內部的可寫緩衝的總大小小於設定的閾值時,呼叫 writable.write() 會返回 true。 一旦內部緩衝的大小達到或超過閾值時,則會返回 false。
3、使用問題
如果讀寫速度不一致,可能會導致爆倉!
1、兩種模式
可讀流實質上運作於流動中(flowing)或已暫停(paused)兩種模式之一。
在 flowing 模式中,資料自動地從底層的系統被讀取,並通過 eventemitter 介面的事件盡可能快地被提供給應用程式。在 paused 模式中,必須顯式呼叫 stream.read() 方法來從流中讀取資料片段
2、模式切換
所有可讀流都開始於 paused 模式,可以通過以下方式切換到 flowing 模式:
可讀流可以通過以下方式切換回 paused 模式:
3、相關事件
data
'data'
事件會在流將資料傳遞給消費者時觸發
close
當流或其底層資源(比如檔案描述符)被關閉時,觸發'close'
事件
end
'end'
事件將在流中再沒有資料可供消費時觸發
4、相關方法
push
readable.push(chunk[, encoding])
chunk | 壓入讀佇列的資料塊
encoding:編碼
當可讀流處在傳輸模式下,』data』事件觸發時,可以通過 呼叫readable.read() 方法讀出來資料,這資料是用readable.push()新增的
readable.read([size])
readable.read()方法從內部緩衝區中抽出並返回一些資料。 如果沒有可讀的資料,返回null。readable.read()方法預設資料將作為「buffer」物件返回。
readable.read()方法只應該在暫停模式下的可讀流上執行。
在流模式下,readable.read()自動呼叫直到內部緩衝區的資料完全耗盡。
readable.pause()
readable.pause() 方法將會使 flowing 模式的流停止觸發 『data』 事件, 進而切出 flowing 模式。任何可用的資料都將儲存在內部快取中。
readable.resume()
readable.resume() 方法會重新觸發 『data』 事件, 將暫停模式切換到流動模式。
readable.pipe(destination)
destination 資料寫入目標
readable.pipe() 繫結乙個 writable 到 readable 上, 將可寫流自動切換到 flowing 模式並將所有資料傳給繫結的 writable。資料流將被自動管理。這樣,即使是可讀流較快,目標可寫流也不會超負荷(overwhelmed)
參考nodejs內建模組之http模組
2、相關事件
close
當流或其底層資源(比如檔案描述符)被關閉時,觸發 『close』 事件。
drain
如果呼叫 stream.write(chunk) 方法返回 false,則在適合恢復寫入資料到流時觸發 『drain』 事件。
finish
呼叫 stream.end() 方法且緩衝資料都已經傳給底層系統之後,觸發 『finish』 事件。
3、相關方法
writable.write(chunk[, encoding][, callback])
writable.write() 方法寫入一些資料到流中,並在這些資料被完全處理之後呼叫提供的 callback。
引數說明:
writable.end([chunk][, encoding][, callback])
呼叫 writable.end() 方法表明已沒有資料要被寫入可寫流。
可選的 chunk 和 encoding 引數可以在關閉流之前立即再寫入一塊資料。 如果傳入了可選的 callback 函式,則它會做為***被新增到 『finish』 事件。
呼叫 stream.end() 之後再呼叫 stream.write() 方法會導致錯誤。
01_流_基本使用.js
const fs = require("fs")
const readstream = fs.createreadstream("./test.mp4")
const writestream = fs.createwritestream("./test2.mp4")
readstream.on
("data",(data)=>)
readstream.on
("end",()=>)
02_流_優化(防緩衝流爆倉).js
const fs = require("fs")
const readstream =fs.createreadstream("./test.mp4")
const writestream =fs.createwritestream("./test2.mp4")
readstream.on
("data",(data)=>
})readstream.on
("end",()=>)
writestream.on
("drain",()=>)
03_流_優化(管道).js
const fs = require("fs")
const readstream =fs.createreadstream("./test.mp4")
const writestream =fs.createwritestream("./test2.mp4")
readstream.pipe(writestream)
支付寶介面呼叫之流程
1.使用者系統生成訂單資訊,生成支付token,存入redis,key為token,value為orderid,可以設定乙個過期時間,使其訂單在規定時間未支付就失效 2.呼叫支付寶支付時通過token得到orderid,然後根據orderid得到訂單資訊,然後把訂單資訊封裝form以post方式提交...
KVM使用之映象
型別 file vbd vmdk qcow logical volume 映象建立 1.映象建立 qemu img create f qcow2 disk.img 5g 或者dd if dev zero of disk.img bs 1g count 5 我們的環境中使用vbd 2.rawdisk ...
git 使用之路
目錄 1.構建倉庫 2.分支命令 3.拉取和提交 4.檢視命令 5.刪除和恢復 正文 1.構建倉庫,將倉庫推到遠端上 git init git add git commit m 注釋 git remote add origin 遠端倉庫位址 git push u origin master 客戶端首...