NodeJS stream入門

本文簡介

點贊 + 關(guān)注 + 收藏 = 學會了


Stream 是一個概念罩驻,翻譯成中文就是 “流” 的意思。它并非 NodeJS 獨有珠插。

本文就用 NodeJS 舉例說明 Stream 秧骑。



Stream 簡介

在傳輸大文件、視頻户誓、音頻時,通常是分段傳輸?shù)哪幌溃梢园堰@個概念粗略的理解成 Stream帝美。

Stream 的中文意思是 “流” ,我在網(wǎng)上找了個圖很好的講明這個東西晤硕。

file

傳多少過來就接多少悼潭,而這個傳輸過程我們使用 NodeJS 時是不需要關(guān)心的,因為 NodeJS 提供了對應的方法來處理窗骑。

《NodeJS http請求》 中講到的 POST 方法女责,其實也用了這個概念漆枚。

Stream用法

我使用 復制文件內(nèi)容 為例子說明 Stream 创译。


如果文件內(nèi)容很少,我們是可以一次復制完的墙基。但如果文件內(nèi)容很多软族,最好就使用 “分包” 復制的方式刷喜。而這些 NodeJS 都為我們處理好了。


我準備了3個文件立砸,它們分別是 index.js 掖疮、data.txtdata-backup.txt

  • index.js 是編寫 JS 操作代碼的文件
  • data.txt 是數(shù)據(jù)文件
  • data-backup.txt 是備份數(shù)據(jù)的文件颗祝,默認為空


data.txt 文件內(nèi)容

123
456
789
0

只有這10個數(shù)字


index.js 文件內(nèi)容

const fs = require('fs')
const path = require('path')

const fileName1 = path.resolve(__dirname, 'data.txt')
const fileName2 = path.resolve(__dirname, 'data-backup.txt')

const readStream = fs.createReadStream(fileName1)
const writeStream = fs.createWriteStream(fileName2)

readStream.pipe(writeStream)

let count = 0

readStream.on('data', chunk => {
  console.log(`第 ${++count} 次傳輸`)
  console.log(chunk.toString())
})

readStream.on('end', () => {
  console.log('復制完成')
})

解析:

  • 首先引入 fspath 模塊浊闪,可對文件進行操作
  • 獲取 data.txtdata-backup.txt 文件,并分別賦值給 fileName1fileName2
  • 使用 pipe 方法螺戳,將 data.txt 的內(nèi)容流向 data-backup.txt
  • 使用 count 計算分包數(shù)量
  • 使用 on - data 來監(jiān)聽數(shù)據(jù)傳輸?shù)倪^程
  • 使用 on - end 來監(jiān)聽數(shù)據(jù)傳輸完成


此時運行 index.js 搁宾,控制臺就會輸出

第 1 次傳輸
123
456
789
0
復制完成

在內(nèi)容比較少時,看不出 Stream 的作用倔幼。


但如果此時讓 data.txt 內(nèi)容變多盖腿,比如里面有10萬個單詞。那就能看出 Stream 的作用了损同。


VS Code 中翩腐,將 data.txt 的語言模式改成 HTML

file


然后輸入 lorem100000 然后按回車,就能自動幫輸入10萬個單詞膏燃。 lorem 后面加的數(shù)字就是要輸入的單詞書茂卦。

file


按下回車后

file


保存 data.txt ,然后再執(zhí)行 index.js 组哩。

此時打開控制臺就可以看到分包的情況了疙筹。

file

以上就是 Stream 的簡單介紹。



總結(jié)

Stream 可以理解為分包禁炒,“流” 的意思就是一點點流過來而咆,而不是一次把所有搬過來。

你可以想象一下搬家的情況幕袱,如果你在一個地方生活了一段時間暴备,生活用品、家具各種東西都多起來后们豌,基本不可能一次把所有東西都搬走涯捻。通常你需要把東西一份份打包好,然后一份份搬到樓下望迎,再搬上車運走障癌。這就是 Stream 的概念。


再比如電視直播辩尊,如果把直播內(nèi)容都錄好涛浙,再一次過打包發(fā)送到你的客戶端,那就不可能做到直播了對吧。通常都是錄多少就發(fā)送多少轿亮。



推薦閱讀

??《NodeJS http請求》

??《NodeJS 5分鐘 連接MySQL 增刪改查》

??《NodeJS 操作cookie》

??《NodeJS 5分鐘 連接 Redis 讀寫操作》

??《NodeJS 讀寫文件》
點贊 + 關(guān)注 + 收藏 = 學會了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疮薇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子我注,更是在濱河造成了極大的恐慌按咒,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件但骨,死亡現(xiàn)場離奇詭異励七,居然都是意外死亡,警方通過查閱死者的電腦和手機奔缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門呀伙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人添坊,你說我怎么就攤上這事剿另。” “怎么了贬蛙?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵雨女,是天一觀的道長。 經(jīng)常有香客問我阳准,道長氛堕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任野蝇,我火速辦了婚禮讼稚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绕沈。我一直安慰自己锐想,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布乍狐。 她就那樣靜靜地躺著赠摇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浅蚪。 梳的紋絲不亂的頭發(fā)上藕帜,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音惜傲,去河邊找鬼洽故。 笑死,一個胖子當著我的面吹牛盗誊,可吹牛的內(nèi)容都是我干的时甚。 我是一名探鬼主播隘弊,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撞秋!你這毒婦竟也來了长捧?” 一聲冷哼從身側(cè)響起嚣鄙,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤吻贿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哑子,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舅列,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年卧蜓,在試婚紗的時候發(fā)現(xiàn)自己被綠了帐要。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡弥奸,死狀恐怖榨惠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盛霎,我是刑警寧澤赠橙,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站愤炸,受9級特大地震影響期揪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜规个,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一凤薛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诞仓,春花似錦缤苫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帜矾,卻和暖如春翼虫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡萤。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工珍剑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人死陆。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓招拙,卻偏偏與公主長得像唧瘾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子别凤,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容