日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩激情在线一区二区三区 | 久久久看 | 国产美女作爱视频 | av免费网页 | 97人人插| 日韩欧美一区二区三区久久婷婷 | 国产第2页| 国产又大又黄视频 | 中文字幕乱码一二三区 | 婷婷综合在线视频 | 成年人在线观看视频免费 | 男生操女生在线观看 | 欧美国产精品一区 | 精品亚洲aⅴ无码一区二区三区 | 中国国产黄色片 | 欧美xxxxbbb | 91蝌蚪视频在线观看 | 五月天综合社区 | 一级黄av| 激情五月综合色婷婷一区二区 | 亚洲色图20p | 69精品丰满人妻无码视频a片 | 欧美日韩aa | 久久精品这里 | 国产视频一区三区 | 日本少妇激三级做爰在线 | 中文字幕精品久久久久人妻红杏ⅰ | 又粗又猛又爽又黄的视频 | 精品人妻人人做人人爽夜夜爽 | 天天射日 | 精品91久久久久久 | 日韩色图一区 | 国产高清成人久久 | 中文字幕在线视频免费观看 | av视屏 | 中国三级视频 | 91精品国产乱码久久久 | 97人妻精品一区二区免费 | 国产愉拍 | 日本xxxxxwwwww| 日韩精品在线观看免费 | 1000部啪啪未满十八勿入 | 国产玖玖在线 | 国精产品一区一区三区视频 | 日日夜夜一区二区 | 操碰视频在线 | 冲田杏梨在线 | 中字幕视频在线永久在线观看免费 | 亚洲另类av | 国内精品在线观看视频 | 国产视频一区二区三区四区五区 | 天堂网一区二区三区 | 免费一二三区 | 精品国产乱码久久久久久闺蜜 | 国产av无码专区亚洲av | 国产这里只有精品 | 三上悠亚人妻中文字幕在线 | 中文字幕高清av | 日韩欧美在线观看一区 | 99网站| 国产粉嫩av | 波多野结衣一区 | 男人操女人的视频 | 婷婷四房综合激情五月 | 亚洲精品乱码久久久久久黑人 | 91天天| 亚洲熟伦熟女新五十路熟妇 | 精品久久网 | 日本女人一级片 | 青娱乐91| 日韩在线色 | 高清视频免费在线观看 | 国产乱码精品一区二区 | 久久夜夜操妹子 | 国产一二三区在线 | 欧美在线一二三 | 中文字幕人妻一区二 | 麻豆影视免费观看 | 欧美日韩一区二区在线观看 | 欧美在线专区 | av日韩一区二区 | 亚洲精品视频网 | 黄色片免费网站 | 95在线视频 | 操人视频在线观看 | 亚洲一区二区三区免费观看 | 日韩欧美在线看 | 黄污视频在线播放 | 午夜国产在线视频 | 日韩欧美猛交xxxxx无码 | 日本福利在线 | 免费又黄又爽又猛大片午夜 | 天堂在线视频网站 | 91不卡视频 | 亚洲精品9999 | 老司机免费精品视频 | 91九色蝌蚪91por成人 | 亚洲成人少妇 | 亚洲天堂资源网 |