Nodejs中流的操作

2022-06-07 22:39:12 字數 2906 閱讀 4999

fs與流都可以處理檔案,為什麼還要用流:

fs模組處理檔案的缺點:將檔案的資料全讀到記憶體中,在把資料寫到檔案內,會大量占用記憶體

流:流(stream)是 node.js 中處理流式資料的抽象介面,是一組有序的,有起點和終點的位元組資料傳輸手段。可以實現將資料從乙個地方流動到另乙個地方,其邊讀取邊寫入的特點有別於fs模組的檔案處理,並且可以做到控制讀取檔案和寫入檔案的速度,從而減少記憶體的占用

nodejs中提供了許多種流的物件,像用http模組建立的伺服器的**內,req就是乙個可讀流,res就是可寫流

流的特點:

1、邊讀  邊寫,是邊讀邊寫的,讀取一段檔案,就將它寫入

2、流是基於事件的,所有的流物件都用 on繫結事件,並觸發

node.js 中有四種基本的流型別:

可讀流:

let fs = require('fs')

//引數1:要讀取的檔案

//引數2:配置項,有highwatermark 每次能讀取多少,預設是64k,一次讀取64k 不需要更改

let rs = fs.createreadstream('1.txt', )

// 預設是不會把讀取的檔案給你 需要監聽事件,資料到來的事件 rs.emit('data',資料);

// 所以把那個繫結這個事件

fs.on('data',function(chunk))

// 預設這個data事件不停的觸發,直到檔案中的資料全部讀完

rs.on('end', function () )

如果每次讀取多少需要自己設定highwatermark ,讀取檔案的時候為了不亂碼,需要用到buffer拼接轉化

let rs = fs,createreadstream('1.txt', )

let arr =

rs.on('data',function(chunk))

// 當檔案全部讀完,觸發end

res.end('end',function())

//報錯是 觸發err 檔案不存在,會觸發這個事件

rs.on('err', function(err))

如果想要控制讀取的速度,可以用rs.pause() 暫停data事件的觸發,  rs.resume() 恢復data事件的觸發

let arr = 

rs.on('data',function(chunk),1000)

})rs.on('end', ()=>)

可寫流:

1、當往可寫流裡寫資料的時候,不會立刻寫入檔案,先寫入快取區,快取區的大小就是highwatermark,預設為16k

等快取區滿了之後,再次真正的寫入檔案裡

2、通過判斷ws.write的返回值判斷快取區是否已經滿了。為true是,還沒滿,有空間,可以繼續寫,為false時,表示滿了

3、按理說如果返回false,就不能再往裡寫了,但是如果寫了,不會丟失,會先快取在記憶體中,等緩衝區寫完清空之後,在從記憶體中讀取寫入。

所以一般在讀取檔案寫入的時候。當快取區滿了,一般會暫停可讀流的讀取  data事件,等寫完之後再次出發可讀流的data讀取檔案,所以不會占用太多的記憶體

const fs = require('fs')

//第乙個引數,寫入的檔案位置 名稱

// 第二引數,配置項

let ws = fs.createwritestream('./a.txt', )

var flag = ws.write('1', function(){}) //flag為true

//write 寫的內容,必須是 字串或者buffer,

// 會返回乙個布林值,提示是否還有空間寫入, 與highwatermark對應,例如為寫入1時,第一次寫 返回乙個true,表示還有空間寫入

//write是非同步的 有**函式,但是不常用

var flag = ws.write('2', function(){}) //flag為false

var flag = ws.write('3', function(){})

// 當資料寫入檔案後,又有空間繼續寫入時,觸發drain事件

ws.on('drain',function())

// 當所有檔案寫完之後,觸發end,也可以在end時,在寫入最後的資料

ws.end('結束寫入')

利用可讀流可寫流,實現乙個pipe,邊讀邊寫,控制讀取可寫入的速度:

讀取30b的檔案,每次只能讀5b,每次只能寫入1b

1、可讀流第一次讀取5b

2、可寫流寫入讀取流讀取的資料,拿到5b開始寫,因為設定了highwatermark為1,寫了1b之後,ws.write()就返回fasle。

表示沒有空間在寫入了,剩下的4b放到記憶體中,開始1b  1b的寫入

3、ws.write()返回false後,暫停可讀流 的 data事件,等待5b全部寫入

4、 5b寫完後,觸發ws.on('drain',function()),    恢復可讀流的 data事件,再次讀取了5b

5、直到檔案讀完,寫完

const fs = require('fs')

function pipe(readfile,writefileu))

let ws = fs.createwritestream(writefileu,)

rs.on('data',function(chunk)

})// 當觸發可寫流的drain,表示有空間繼續寫入了,繼續讀取檔案

ws.on('drain',function())

// 當讀取流觸發end方法,表示讀取完畢,這時關閉可寫流的寫入

rs.on('end',function())

}pipe('1.txt','./2.txt')

nodejs中流 stream 的理解

nodejs的fs模組並沒有提供乙個copy的方法,但我們可以很容易的實現乙個,比如 var source fs.readfilesync path to source fs.writefilesync path to dest source 如上面高大上的所示,我們把檔案比作裝水的桶,而水就是檔案...

nodejs 基本操作

檢視nodejs版本 nodejs v 公升級nodejs node有乙個模組叫n 這名字可夠短的。是專門用來管理node.js的版本的。首先安裝n模組 npm install g n 第二步 公升級node.js到最新穩定版 n stable npm v 顯示版本,檢查npm 是否正確安裝。npm...

node中流的理解

對於前端同學來講流的概念還是不太好理解的。然而stream模組是node中乙個非常重要的模組。node官方文件上是這麼描述的 流 stream 是一種在 node.js 中處理流式資料的抽象介面 那我們姑且這麼理解吧 流就是為我們提供了一套處理資料的工具。readable 可讀的流 例如 fs.cr...