Stream 模組學習 七

2021-08-21 11:23:57 字數 2945 閱讀 2697

在這之前實現了流的流動模式,這裡實現乙個流的暫停模式

let eventemitter = require('events')

let fs = require('fs')

class readablereadstream extends eventemitter )

} //關閉檔案

destory ()

// 開啟檔案啊

open ()

read(n)

// 封裝讀取的方法

_read ()

}module.exports = readablereadstream

let eventemitter = require('events')

let fs = require('fs')

class readablereadstream extends eventemitter )

} //關閉檔案

destory () )

} // 開啟檔案啊

open ()

this.fd = fd

this.emit('open')

})} // 讀取內容方法

read(n)

// 封裝讀取的方法

_read ()

}module.exports = readablereadstream

let eventemitter = require('events')

let fs = require('fs')

class readablereadstream extends eventemitter )

} //關閉檔案

destory () )

} // 開啟檔案啊

open ()

this.fd = fd

this.emit('open')

})} /**

* @description 讀取快取區的內容

* @param n 讀取內容的長度

*/read(n)

break}}

}}

// 更改狀態

if (this.length === 0) this.emittedreadable = true

// 如果當前快取區的小於highwatermark時再去讀取

if (this.length < this.highwatermark)

}return buffer

} // 封裝讀取的方法

_read ()

}module.exports = readablereadstream

let eventemitter = require('events')

let fs = require('fs')

class readablereadstream extends eventemitter )

} //關閉檔案

destory () )

} // 開啟檔案啊

open ()

this.fd = fd

this.emit('open')

})} /**

* @description 讀取快取區的內容

* @param n 讀取內容的長度

*/read(n)

break}}

}}

// 更改狀態

if (this.length === 0) this.emittedreadable = true

// 如果當前快取區的小於highwatermark時再去讀取

if (this.length < this.highwatermark)

}return buffer

} // 封裝讀取的方法

_read ()

// 將讀取的內容放入快取區

// buffer.slice(0, bytesread) // 在結束的時候可能會出現長度不夠的情況,這裡只儲存有內容的部分

this.buffers.push(buffer.slice(0, bytesread))

this.pos += bytesread // 更新讀取的索引

this.length += bytesread // 更新快取區的大小

// 判斷是否需要觸發readable事件

if (this.emittedreadable)

})}}

module.exports = readablereadstream

let fs = require('fs')

let path = require('path')

let readstream = require('./readablereadstream')

// 這裡我們使用自己實現的流讀取檔案

let rs = new readstream(path.join(__dirname, './1.txt'), )

// 監聽readable事件

rs.on('readable', () => , 1000);

})

以上 通過四個步奏實現了乙個簡單的readable的流,感覺需要注意的幾個點如下:

1.我們快取區的大小的維護,每乙個操作借點一定不能遺漏

2.在read方法內部讀取快取區大小的時候,有可能會出現內容沒有被消費完的情況,需要我們在結尾做乙個判斷,如果還有內容,就把這部分內容使用slice為乙個新的buffer物件,並放在陣列的開始,下次從這個buffer物件開始讀取

3.內部的讀取檔案也會存在乙個可能最後一次讀到的內容不是整個buffer的情況,需要做判斷處理,**備註裡有提到,需要特別注意一下

Nodejs學習筆記之Stream模組

nodejs的fs模組並沒有提供乙個copy的方法,但我們可以很容易的實現乙個,這種方式是把檔案內容全部讀入記憶體,然後再寫入檔案,對於小型的文字檔案,這沒有多大問題,比如grunt file copy就是這樣實現的。一,開篇分析 流是乙個抽象介面,被 node 中的很多物件所實現。比如對乙個 ht...

Node常用內建模組 stream

檔案流讀取文字內容 use strict var fs require fs var rs fs.createreadstream sample.txt utf 8 rs.on data function chunk rs.on end function chunk rs.on error func...

request模組及stream流

可用於發起 http 或 https 請求,可理解成服務端的 ajax 請求。可用於簡單的伺服器 用法和 ajax 類似。const request require request request.get error,response,body or request error,response,b...