本文簡介
點贊 + 關(guān)注 + 收藏 = 學會了
Stream
是一個概念罩驻,翻譯成中文就是 “流” 的意思。它并非 NodeJS
獨有珠插。
本文就用 NodeJS
舉例說明 Stream
秧骑。
Stream 簡介
在傳輸大文件、視頻户誓、音頻時,通常是分段傳輸?shù)哪幌溃梢园堰@個概念粗略的理解成 Stream
帝美。
Stream
的中文意思是 “流” ,我在網(wǎng)上找了個圖很好的講明這個東西晤硕。
傳多少過來就接多少悼潭,而這個傳輸過程我們使用 NodeJS
時是不需要關(guān)心的,因為 NodeJS
提供了對應的方法來處理窗骑。
在 《NodeJS http請求》 中講到的 POST
方法女责,其實也用了這個概念漆枚。
Stream用法
我使用 復制文件內(nèi)容 為例子說明 Stream
创译。
如果文件內(nèi)容很少,我們是可以一次復制完的墙基。但如果文件內(nèi)容很多软族,最好就使用 “分包” 復制的方式刷喜。而這些 NodeJS
都為我們處理好了。
我準備了3個文件立砸,它們分別是 index.js
掖疮、data.txt
和 data-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('復制完成')
})
解析:
- 首先引入
fs
和path
模塊浊闪,可對文件進行操作 - 獲取
data.txt
和data-backup.txt
文件,并分別賦值給fileName1
和fileName2
- 使用
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
然后輸入 lorem100000
然后按回車,就能自動幫輸入10萬個單詞膏燃。 lorem
后面加的數(shù)字就是要輸入的單詞書茂卦。
按下回車后
保存 data.txt
,然后再執(zhí)行 index.js
组哩。
此時打開控制臺就可以看到分包的情況了疙筹。
以上就是 Stream
的簡單介紹。
總結(jié)
Stream
可以理解為分包禁炒,“流” 的意思就是一點點流過來而咆,而不是一次把所有搬過來。
你可以想象一下搬家的情況幕袱,如果你在一個地方生活了一段時間暴备,生活用品、家具各種東西都多起來后们豌,基本不可能一次把所有東西都搬走涯捻。通常你需要把東西一份份打包好,然后一份份搬到樓下望迎,再搬上車運走障癌。這就是 Stream
的概念。
再比如電視直播辩尊,如果把直播內(nèi)容都錄好涛浙,再一次過打包發(fā)送到你的客戶端,那就不可能做到直播了對吧。通常都是錄多少就發(fā)送多少轿亮。
推薦閱讀
??《NodeJS 讀寫文件》
點贊 + 關(guān)注 + 收藏 = 學會了