在這之前實現了流的流動模式,這裡實現乙個流的暫停模式
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...