什麼是流?如何理解流?以下這篇文章就帶大家深入了解Nodejs中的串流(Stream),希望對大家有幫助!
stream 也就是流,可以理解為一連串的位元組像水流那樣的存在。依照官方文件的解釋:
A stream is an abstract interface for working with streaming data in Node.js.
#流是用於在Node.js 中處理流數據,也就是連續位元組的抽象介面。 流有 4 種基本類型,本篇文章主要介紹其中兩種 —— 可讀流和可寫流。
我們可以透過fs.createReadStream()
建立一個可讀流readableStream
,第1 個參數可以是要讀取的檔案路徑,例如現有檔案test.txt 內容為:
hello juejin
第2 個參數(可選)可以傳入一個選項對象,用來控制讀取取資料的起止位置等: 【相關教學推薦:nodejs影片教學】
const fs = require('fs') const readableStream = fs.createReadStream('./test.txt', { start: 6, end: 11 })
注意,讀取的資料是包含了start
和end
的。在之前介紹 events 模組時說過,所有的流都是 EventEmitter
的實例。所以取得資料是透過監聽'data'
事件:
readableStream.on('data', data => { console.log(data) console.log(data.toString()) })
列印結果如下,預設是Buffer 對象,可以透過toString()
方法轉為字串:
注意,讀取資料時一次最多讀取64 * 1024 位元組,如果想改變該數值,可以透過highWaterMark
選項更改。另外也可以使用pause()
進行暫停操作,使用resume()
繼續讀取:
const readableStream = fs.createReadStream('./test.txt', { start: 6, end: 11, highWaterMark: 2 // 默认为 64 * 1024 }) readableStream.on('data', data => { console.log(data) console.log(data.toString()) readableStream.pause() // 暂停读取 setTimeout(() => { readableStream.resume() // 恢复读取 }, 2000) })
執行結果如下:
##除了'data' 事件,可讀流還有其它一些事件,例如監聽檔案被開啟的
'open'(回呼會被傳入
fd 參數),監聽檔案讀取到end(預設為讀取到最後)的
'end',監聽檔案關閉的
'close' (檔案讀取完會自動關閉):
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('文件已关闭'))
fs.createWriteStream() 可以建立可寫流,第1 個參數傳入要寫入的文件,第2 個同樣是用於配置的可選參數,這裡我們將
flags 由表示覆蓋寫入的
'w' 改為
'a',即追加寫入(如果也指定了寫入的起始位置
start,則為了相容windows 系統,
flags 應該寫成
'r '):
const writableStream = fs.createWriteStream('test.txt', { flags: 'a' }) writableStream.write('养成', err => console.log(`错误信息:${err}`)) // 错误信息:undefined writableStream.write('写作的') writableStream.end('好习惯')
write 方法,上方程式碼執行的結果就是在原本的"hello juejin" 後面加上了"養成寫作的好習慣"。最後一次寫入可以使用
end 方法,這樣就能監聽到可寫流的
'close' 事件了:
writableStream.on('close', () => { console.log('关闭') })
writableStream.close() 關閉才能監聽到
'close' 事件。如果寫入成功,則作為
write()/end() 的第 2 個參數傳入的回調的
err 就為
undefined。
'open' 事件,當
close() 或
end() 被呼叫後檔案寫入完成的
'finish' 事件。
pipe 方法連接,實現對文件的複製:
const readableStream = fs.createReadStream('./test.txt') const writableStream = fs.createWriteStream('./copy.txt') readableStream.pipe(writableStream)
nodejs 教學!
以上是一文聊聊Node中的stream(流)的詳細內容。更多資訊請關注PHP中文網其他相關文章!