日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

简明writeStream实现

發(fā)布時(shí)間:2025/3/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简明writeStream实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Pro

一個(gè)createWriteStream的簡(jiǎn)單實(shí)現(xiàn),以求能增加對(duì)可寫流的理解與應(yīng)用。

參數(shù)配置

/*** createWriteStream* @param1 path* @param2 options*/ let fs = require('fs'); let ws = fs.createWriteStream('./1.txt',{flags:'w'//文件的打開模式,mode:0o666//文件的權(quán)限設(shè)置,encoding:'utf8'//寫入文件的字符的編碼,highWaterMark:3//最高水位線,start:0 //寫入文件的起始索引位置 ,autoClose:true//是否自動(dòng)關(guān)閉文檔 }) 復(fù)制代碼

createWriteStream類的實(shí)例化

  • 實(shí)例化一個(gè)createWriteStream類
    • 將path,options掛載在createWriteStream的實(shí)例上,除此之外再在實(shí)例上掛載以下屬性
      • self.fd=null:文件打開后返回的文件描述符
      • self.pos=self.start:用于表示文件真正寫入時(shí)的指針位置
      • self.Buffer=[]:用來表示文件的緩沖區(qū)
      • self.len=null:用來表示緩沖區(qū)此時(shí)的大小
      • self.isWriting=false:用來表示是否正在真正寫入文件
    • 調(diào)用open方法,打開文件(發(fā)射open事件)

實(shí)例write方法的執(zhí)行流程

  • wirte方法接收三個(gè)參數(shù),chunk要寫入的內(nèi)容,encoding要進(jìn)行的,cb回調(diào)函數(shù)。
  • write執(zhí)行流程:
    • 判斷傳入的chunk是否為buffer,如果不是,則轉(zhuǎn)換成buffer,用于轉(zhuǎn)化編碼依據(jù)傳入的encoding參數(shù)。
    • 更新Buffer緩沖區(qū)的len長(zhǎng)度,讓len加上該次chunk的長(zhǎng)度
    • 判斷l(xiāng)en是否已經(jīng)超過highWaterMark,將值存入flag
    • 判斷是否處于isWriting狀態(tài):
      • 是,則先加chunk寫入實(shí)例對(duì)象下的Buffer緩沖區(qū)。
      • 否,更新isWriting,接將參數(shù)傳遞給實(shí)例下的_write方法寫入文件
    • 返回flag

實(shí)例_write方法的執(zhí)行流程

此方法用于真正寫入文件

  • 查看實(shí)例的fd屬性是否存在(文件是否打開成功)
    • 成功,調(diào)用fs模塊的write方法正式寫入數(shù)據(jù)
      • 更新實(shí)例對(duì)象下的len以及pos屬性
      • 調(diào)用clearBuffer方法將緩沖區(qū)的內(nèi)容寫入
      • 調(diào)用write方法傳入的回調(diào)函數(shù)cb
    • 失敗,訂閱一個(gè)open事件(open事件將會(huì)在open方法中被發(fā)射),在訂閱中的回調(diào)方法中再次以相同的參數(shù)調(diào)用_write方法

實(shí)例clearBuffer方法

  • 從緩沖區(qū)中取出一個(gè)數(shù)據(jù)
    • 如果數(shù)據(jù)存在,調(diào)用_write方法
    • 如果數(shù)據(jù)不存在,將isWriting更改為false,發(fā)射drain事件

實(shí)現(xiàn)源碼以及測(cè)試文件

let fs = require('fs'); let EventEmitter = require('events');class WriteStream extends EventEmitter {constructor(path, options) {super();let self = this;Object.assign(self, options); //還需設(shè)置默認(rèn)值self.path = path;self.isWriting = false;self.Buffer = []; //源碼中為鏈表實(shí)現(xiàn)的緩沖區(qū)self.len = null;self.pos = self.start; //初始化寫入位置self.fd = null;self.open();}open() {let self = this;fs.open(self.path, self.flags, self.mode, (err, fd) => {self.fd = fd;if (err) return self.destroy(err);self.emit('open');});}destroy(err) {fs.close(this.fd, () => {this.emit('error', err);});}write(chunk, encoding, cb) {let self = this, ret = null;encoding = encoding?encoding:self.encoding; //優(yōu)先使用write傳入的編碼方式chunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding);self.len += chunk.length;ret = self.highWaterMark > self.len; //判斷當(dāng)前最新的緩沖區(qū)是否已達(dá)到最高水位線if (self.isWriting) { //說明正在調(diào)用底層方法真正寫入文件,先寫入Bufferself.Buffer.push({chunk, cb});} else {self.isWriting = true;self._write(chunk, cb, () => self.clearBuffer());}return ret;}_write(chunk, cb, clear) {let self = this;if (!self.fd) return self.once('open', () => {self._write(chunk, cb, clear)});fs.write(self.fd, chunk, 0, chunk.length, self.pos, (err, bytesWritten) => {if (err) {if (self.autoClose) {self.destroy();self.emit('error', err);}}self.len -= bytesWritten;self.pos += bytesWritten;cb && cb();clear && clear();});}clearBuffer() {let self = this, data = null;data = self.Buffer.shift();if (data) {self._write(data.chunk, data.cb, () => self.clearBuffer());} else { //此時(shí)說明緩沖區(qū)已無數(shù)據(jù)self.isWriting = false;self.emit('drain');}} }module.exports = WriteStream; 復(fù)制代碼

測(cè)試文件:

let WriteStream = require('./practice'); let ws = new WriteStream('./1.txt',{flags:'w',mode:0o666,start:0,encoding:'utf8',autoClose:true //當(dāng)流寫完之后自動(dòng)關(guān)閉文件,highWaterMark:3 }); let n = 9; ws.on('error',(err)=>{console.log(err) }) function write(){let flag = true;while(flag&&n>0){flag = ws.write(n+"",'utf8',()=>{console.log('ok');});n--;console.log('flag=',flag)}ws.once('drain',()=>{console.log('drain');write();}) } // ws.on('drain',()=>{ // console.log('drain'); // write(); // }) write();復(fù)制代碼

參考資料: nodejs.org/dist/latest…

總結(jié)

以上是生活随笔為你收集整理的简明writeStream实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天摸天天看 | www插插插无码免费视频网站 | 久久成人免费视频 | 97视频在线播放 | 久久精品国产99久久久 | 91丝袜呻吟高潮美腿白嫩在线观看 | 日剧再来一次第十集 | 国产天堂 | 狠狠躁日日躁夜夜躁2022麻豆 | 深夜老司机福利 | 久一在线视频 | 黄视频网站在线看 | 国产精品视频看看 | 欧美成人xxxx | 影音先锋在线看片资源 | 一级片久久久 | 日韩精品久久一区 | 久久亚洲一区 | 新呦u视频一区二区 | 国产精品久久久久久久久久免费看 | 修女也疯狂3免费观看完整版 | 欧美在线三区 | 日韩视频精品在线 | 免费av资源| 午夜亚洲天堂 | 欧美xxxx黑人xyx性爽 | 天堂岛av | 久久亚洲av成人无码国产电影 | 娇妻被老王脔到高潮失禁视频 | 日本国产中文字幕 | 中文字幕123| 欧美大黄视频 | 日韩免费视频 | 波多野结衣高清视频 | 欧美xxxx性 | 动漫玉足吸乳羞免费网站玉足 | 精品人妻无码一区二区色欲产成人 | 中文字幕第9页 | 天堂在线中文8 | 神马久久精品 | 麻豆免费在线视频 | 欧美系列第一页 | 成人性生生活性生交全黄 | 在线播放成人av | 韩日成人 | 看日本毛片 | 国产精品日韩 | 亚洲国产免费视频 | 在线观看中文字幕码 | 少妇高潮一区二区三区在线 | 台湾av在线播放 | 人妻精品久久久久中文 | 国产精品午夜电影 | av女星全部名单 | 免费视频www在线观看网站 | 日本一区二区三区在线看 | 性饥渴的农村熟妇 | 奇米精品一区二区三区在线观看 | 国产女人高潮毛片 | 国产成人精品a视频 | 91精品国产高清一区二区三密臀 | 国产盗摄一区二区三区 | 清清草视频 | 午夜精品久久久久久久91蜜桃 | 国产不卡视频在线观看 | 国产美女www | 公交上高潮的丁芷晴 | 激情五月俺也去 | www.国产区 | 国产一级视频免费观看 | 性生活视屏 | 国产片天天弄 | 催眠调教艳妇成肉便小说 | 国产亚洲精品成人av在线 | 日本一区免费电影 | 黄色片免费在线 | 亚洲av无码乱码国产精品fc2 | 欧美激情视频一区二区三区在线播放 | 亚州一级 | 好吊妞这里有精品 | 国产情侣在线播放 | 欧美成人xxx | 精品国产亚洲一区二区麻豆 | porn麻豆 | 免费av播放 | www.色啪啪.com | 天天宗合 | 美女扒开内裤让男人桶 | 麻豆国产精品一区 | 污网在线看 | 明星双性精跪趴灌满h | 国产97超碰 | 一本一道波多野结衣av黑人 | 日韩理论视频 | 青青草久久爱 | 国产鲁鲁视频在线观看特色 | 黄色小视频免费观看 | 欧美又粗又大aaa片 老熟妇仑乱视频一区二区 亚洲妇女体内精汇编 | 久久精品成人 |