Stream文件流
- 文件特別大時(shí)蜻拨,同步會阻塞程序,異步會等待結(jié)果桩引,所以引入流的概念缎讼。
- 流的概念,就跟水流一樣坑匠。比如在看電影時(shí)血崭,電影的資源并不是一瞬間就下載到我們客戶端中的,而是一點(diǎn)一點(diǎn)過來的厘灼。在理想狀態(tài)下夹纫,讀一部分,就寫一部分设凹,在時(shí)間允許情況下舰讹,總會處理完。
- 管道流(pipe):把文件比作裝水的桶闪朱,而水就是文件里的內(nèi)容月匣,我們用一根管子(pipe)連接兩個(gè)桶使得水從一個(gè)桶流入另一個(gè)桶,這樣就慢慢的實(shí)現(xiàn)了大文件的復(fù)制過程奋姿。
Buffer(緩沖區(qū))
- 為什么要使用Buffer锄开?
- 因?yàn)閖avascript中的字符串是以utf-8的格式存儲的,處理二進(jìn)制的能力很弱称诗,而網(wǎng)絡(luò)層對于不同資源的請求和響應(yīng)都是用二進(jìn)制的形式來交互的萍悴。
- 數(shù)據(jù)流是從一個(gè)地方向另一個(gè)地方傳輸數(shù)據(jù)的過程,通常情況下寓免,我們傳輸數(shù)據(jù)往往是為了處理它癣诱,或者讀它,或者基于這些數(shù)據(jù)做處理等袜香。
- 如果處理數(shù)據(jù)的時(shí)間比到達(dá)的時(shí)間快狡刘,而這一時(shí)刻僅僅到達(dá)了一小部分?jǐn)?shù)據(jù),那這小部分?jǐn)?shù)據(jù)需要等待剩下的數(shù)據(jù)填滿困鸥,然后再送過去統(tǒng)一處理。
- 這個(gè)”等待區(qū)域”就是buffer! 它是你電腦上的一個(gè)很小的物理地址剑按,一般在RAM中疾就,在這里數(shù)據(jù)暫時(shí)的存儲、等待艺蝴,最后在流(stream)中猬腰,發(fā)送過去并處理。
- 當(dāng)你看在線視頻時(shí)猜敢,當(dāng)你網(wǎng)絡(luò)連接很慢姑荷,當(dāng)處理完當(dāng)前的數(shù)據(jù)后盒延,你的播放器就會暫停,或出現(xiàn)”緩沖”(buffer)字樣鼠冕,意思是正在收集更多的數(shù)據(jù)添寺,或者等待更多的數(shù)據(jù)到來,才能下一步處理懈费。當(dāng)buffer裝滿并處理好计露,播放器就會顯示數(shù)據(jù),也就是播放視頻了憎乙。在播放當(dāng)前內(nèi)容的時(shí)候票罐,更多的數(shù)據(jù)也會源源不斷的傳輸、到達(dá)和在buffer等待泞边。
- 如果播放器已經(jīng)處理完或播放完前一個(gè)數(shù)據(jù)该押,buffer仍然沒有填滿,”buffering”(緩沖)字符就會再次出現(xiàn)阵谚,等待和收集更多的數(shù)據(jù)蚕礼。
Buffer的操作
// 創(chuàng)建一個(gè)長度為 10、且用 0 填充的 Buffer椭蹄。
const buf1 = Buffer.alloc(10);
// 創(chuàng)建一個(gè)長度為 10闻牡、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 根據(jù)內(nèi)容直接創(chuàng)建buffer
const buf3 = Buffer.from("hello buffer");
buf1.toJSON()
// 一個(gè)空的buffer
buf3.toJSON()
// { type: 'Buffer',data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ] }
// the toJSON() 方法可以將數(shù)據(jù)進(jìn)行Unicode編碼并展示
buf3.length //12 根據(jù)數(shù)據(jù)自動盛滿并創(chuàng)建
//寫入數(shù)據(jù)到buffer
buf1.write("Buffer really rocks!")
//解碼buffer
buf1.toString() // 'Buffer rea'
//因?yàn)閎uf1只能承載10個(gè)字節(jié)的內(nèi)容绳矩,所有多處的東西會被截?cái)?
參考文章:https://blog.csdn.net/qq_34629352/article/details/88037778