什么是流?如何理解流?下面本篇文章就來帶大家深入了解一下Nodejs中的流(Stream),希望對(duì)大家有所幫助!
(資料圖片僅供參考)
stream 也就是流,可以理解為一連串的字節(jié)像水流那樣的存在。按照官方文檔的解釋:
流是用于在 Node.js 中處理流數(shù)據(jù),也就是連續(xù)字節(jié)的抽象接口。流有 4 種基本類型,本篇文章主要介紹其中兩種 —— 可讀流和可寫流。
我們可以通過 fs.createReadStream()創(chuàng)建一個(gè)可讀流 readableStream,第 1 個(gè)參數(shù)可以是要讀取的文件路徑,比如現(xiàn)有文件 test.txt 內(nèi)容為:
hello juejin
第 2 個(gè)參數(shù)(可選)可以傳入一個(gè)選項(xiàng)對(duì)象,用來控制讀取數(shù)據(jù)的起止位置等: 【相關(guān)教程推薦:nodejs視頻教程】
const fs = require("fs")const readableStream = fs.createReadStream("./test.txt", { start: 6, end: 11})注意,讀取的數(shù)據(jù)是包括了 start和 end的。 在之前介紹 events 模塊時(shí)說過,所有的流都是 EventEmitter的實(shí)例。所以獲取數(shù)據(jù)是通過監(jiān)聽 "data"事件:
readableStream.on("data", data => { console.log(data) console.log(data.toString())})打印結(jié)果如下,默認(rèn)是 Buffer 對(duì)象,可以通過 toString()方法轉(zhuǎn)為字符串:
注意,讀取數(shù)據(jù)時(shí)一次最多讀取 64 * 1024 字節(jié),如果想改變?cè)摂?shù)值,可以通過 highWaterMark選項(xiàng)更改。另外還可以使用 pause()進(jìn)行暫停操作,使用 resume()繼續(xù)讀取:
const readableStream = fs.createReadStream("./test.txt", { start: 6, end: 11, highWaterMark: 2 // 默認(rèn)為 64 * 1024})readableStream.on("data", data => { console.log(data) console.log(data.toString()) readableStream.pause() // 暫停讀取 setTimeout(() => { readableStream.resume() // 恢復(fù)讀取 }, 2000)})執(zhí)行結(jié)果如下:
除了 "data"事件,可讀流還有其它一些事件,比如監(jiān)聽文件被打開的 "open"(回調(diào)會(huì)被傳入 fd 參數(shù)),監(jiān)聽文件讀取到 end(默認(rèn)為讀取到最后)的 "end",監(jiān)聽文件關(guān)閉的 "close"(文件讀取完會(huì)自動(dòng)關(guān)閉):
readableStream.on("data", data => console.log(data))readableStream.on("open", fd => console.log(`${fd}文件打開了`))readableStream.on("end", () => console.log("文件讀取到 end 位置了"))readableStream.on("close", () => console.log("文件已關(guān)閉"))打印結(jié)果如下:
使用 fs.createWriteStream()可以創(chuàng)建可寫流,第 1 個(gè)參數(shù)傳入要寫入的文件,第 2 個(gè)同樣是用于配置的可選參數(shù),這里我們將 flags由表示覆蓋寫入的 "w"改為 "a",即追加寫入(如果還指定了寫入的起始位置 start,則為了兼容 windows 系統(tǒng), flags應(yīng)該寫成 "r+"):
const writableStream = fs.createWriteStream("test.txt", { flags: "a"})writableStream.write("養(yǎng)成", err => console.log(`錯(cuò)誤信息:${err}`)) // 錯(cuò)誤信息:undefinedwritableStream.write("寫作的")writableStream.end("好習(xí)慣")寫入數(shù)據(jù)是通過 write方法,上方代碼執(zhí)行的結(jié)果就是在原本的 "hello juejin" 后添加上了 "養(yǎng)成寫作的好習(xí)慣"。最后一次寫入可以使用 end方法,這樣就能監(jiān)聽到可寫流的 "close"事件了:
writableStream.on("close", () => { console.log("關(guān)閉")})否則,可寫流需要手動(dòng) writableStream.close()關(guān)閉才能監(jiān)聽到 "close"事件。如果寫入成功,則作為 write()/end()的第 2 個(gè)參數(shù)傳入的回調(diào)的 err就為 undefined。
可讀流還有另外一些事件,比如文件打開時(shí)的 "open"事件,當(dāng) close()或 end()被調(diào)用后文件寫入完成的 "finish"事件。
可讀流與可寫流可以通過 pipe方法進(jìn)行連接,實(shí)現(xiàn)對(duì)文件的復(fù)制:
const readableStream = fs.createReadStream("./test.txt")const writableStream = fs.createWriteStream("./copy.txt")readableStream.pipe(writableStream)如此,便能將 ./test.txt 內(nèi)的文本復(fù)制到 ./copy.txt 中。
更多node相關(guān)知識(shí),請(qǐng)?jiān)L問:nodejs 教程!
以上就是一文聊聊Node中的stream(流)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!