首頁  >  文章  >  web前端  >  一文聊聊Node中的stream(流)

一文聊聊Node中的stream(流)

青灯夜游
青灯夜游轉載
2023-02-27 19:17:441544瀏覽

什麼是流?如何理解流?以下這篇文章就帶大家深入了解Nodejs中的串流(Stream),希望對大家有幫助!

一文聊聊Node中的stream(流)

stream 也就是流,可以理解為一連串的位元組像水流那樣的存在。依照官方文件的解釋:

A stream is an abstract interface for working with streaming data in Node.js.

#流是用於在Node.js 中處理流數據,也就是連續位元組的抽象介面。 流有 4 種基本類型,本篇文章主要介紹其中兩種 —— 可讀流和可寫流。

可讀的(Readable)

我們可以透過fs.createReadStream() 建立一個可讀流readableStream ,第1 個參數可以是要讀取的檔案路徑,例如現有檔案test.txt 內容為:

hello juejin

第2 個參數(可選)可以傳入一個選項對象,用來控制讀取取資料的起止位置等: 【相關教學推薦:nodejs影片教學

const fs = require('fs')

const readableStream = fs.createReadStream('./test.txt', {
  start: 6,
  end: 11
})

注意,讀取的資料是包含了startend 的。在之前介紹 events 模組時說過,所有的流都是 EventEmitter 的實例。所以取得資料是透過監聽'data' 事件:

readableStream.on('data', data => {
  console.log(data)
  console.log(data.toString())
})

列印結果如下,預設是Buffer 對象,可以透過toString()方法轉為字串:

一文聊聊Node中的stream(流)

注意,讀取資料時一次最多讀取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)
})

執行結果如下:

一文聊聊Node中的stream(流)

##除了

'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('文件已关闭'))

列印結果如下:

一文聊聊Node中的stream(流)

#可寫的(Writable)

使用

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)

如此,便能將./test.txt 內的文字複製到./copy.txt 中。

更多node相關知識,請造訪:

nodejs 教學

以上是一文聊聊Node中的stream(流)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除