gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

淺談Nodejs中的可寫流write與實現方法

本篇文章帶大家了解一下Nodejs中的可寫流write,介紹一下Node可寫流write的實現。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

淺談Nodejs中的可寫流write與實現方法

【推薦學習:《nodejs 教程》】

可寫流-Writable

fs.createWriteStream調用例子

  • 首次讀取的數據會真實寫入目標文件
  • 其余次讀取的數據要根據讀取數據是否超出highWaterMark ,是的話存入緩存區等待寫入目標文件中
const fs = require("fs"); const path = require("path"); const bPath = path.join(__dirname, "b.txt"); let ws = fs.createWriteStream(bPath, {   flags: "w",   encoding: "utf-8",   autoClose: true,   start: 0,   highWaterMark: 3, }); ws.on("open", function (fd) {   console.log("open", fd); }); ws.on("close", function () {   console.log("close"); });  //string 或者buffer,ws.write 還有一個boolea的返回值 ws.write("1"); //flag 表示 當前要寫的值是直接是否直接寫入文件,不能超出了單次最大寫入值highWaterMark let flag = ws.write("1"); console.log({ flag });//true flag = ws.write("1"); console.log({ flag });//false flag = ws.write("1"); console.log({ flag });//false flag = ws.write("14444444"); console.log({ flag });//false ws.end(); //write+close,沒有調用 end 是不會調用 觸發close的,看到這里的小伙伴可以嘗試注釋end() 看看close的console是否有打印
  • 效果

淺談Nodejs中的可寫流write與實現方法

自定義可寫流initWriteStream

繼承EventEmitter發布訂閱

const EventEmitter = require("events"); const fs = require("fs"); class WriteStream extends EventEmitter {} module.exports = WriteStream;

鏈表生成隊列做文件讀取的緩存

鏈表&隊列的實現

https://juejin.cn/post/6973847774752145445

// 用鏈表 生成隊列 對 文件緩存區的讀取 進行優化 const Queue = require("./queue");

初始化實例默認數據constructor()

 constructor(path, options = {}) {     super();     this.path = path;     this.flags = options.flags || "w";     this.encoding = options.encoding || "utf8";     this.mode = options.mode || 0o666; //默認8進制 ,6 6 6  三組分別的權限是 可讀可寫     this.autoClose = options.start || 0;     this.highWaterMark = options.highWaterMark || 16 * 1024; //默認一次讀取16個字節的數據     this.len = 0; //用于維持有多少數據還沒有被寫入文件中     //是否根據等待當前讀取的最大文數據 排空后再寫入     this.needDrain = false; //     // 緩存隊列 用于存放 非第一次的文件讀取 到的數據,因為第一次讀取 直接塞入目標文件中     // 除第一次 的文件讀取數據的都存放再緩存中     // this.cache = [];     // 隊列做緩存     this.cache = new Queue();     // 標記是否是第一次寫入目標文件的標識     this.writing = false;     this.start = options.start || 0;     this.offset = this.start; //偏移量     this.open();   }
  • this.mode 文件操作權限 默認0o666(0o表示8進制)

    • 3個6所占位置分別對應:文件所屬用戶對它的權限 ;文件所屬用戶組用戶對它的權限;表示其他用戶對它的權限

    • 權限由:r–可讀(對應數值4),w–可寫(對應數值2),x–可執行(對應數值1,例如文件夾下有 .exe 這樣的標識 說明點擊可以直接執行)組成

    • 所以默認情況下3組用戶對文件的操作權限都是可讀可寫

open()

  • 調用fs.open()
  • 回調emit實例open方法,fs.open的返回值fd做參數傳入
 open() {     fs.open(this.path, this.flags, this.mode, (err, fd) => {       this.fd = fd;       this.emit("open", fd);     });   }

write()

  • 轉化實例傳入的需要寫入的文件數據格式為buffer
  • 判斷寫入數據長度是否大于highWaterMark,如果達到預期后,文件讀取到的數據存放再緩存里 不直接寫入目標文件(這里要排除是否是第一次讀取文件)
  • 執行實例write 傳入的cb 并調用clearBuffer 清空緩存
  • 判斷 是否是第一次讀取,第一次讀取 直接寫入調用 _write(待實現)
  • 緩存隊列尾部offer 當前讀取到的數據等待寫入目標文件
 write(chunk, encoding = this.encoding, cb = () => {}) {     //  將數據全部轉換成buffer     chunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);      this.len += chunk.length;     // console.log({chunk},this.len )     let returnValue = this.len < this.highWaterMark;     //當數據寫入后,需要在手動的將this.len--     this.needDrain = !returnValue; //如果達到預期 后 的文件讀取 到數據存放再緩存里 不直接寫入目標文件     //清空緩存 對用戶傳入的回調 進行二次包裝     let userCb = cb;     cb = () => {       userCb();       //清空buffer       this.clearBuffer();//馬上實現     };      //此時需要判斷 是否是第一次讀取,第一次讀取 直接寫入調用 _write     if (!this.writing) {       // 第一次||緩存隊列已清空完畢       this.writing = true;       // console.log("first write");       this._write(chunk, encoding, cb);//馬上實現     } else {     //緩存隊列尾部offer 當前讀取到的數據等待寫入目標文件       this.cache.offer({         chunk,         encoding,         cb,       });     }     return returnValue;   }

clearBuffer()依次清空緩存隊列

  • 隊列執行順序,先進先出原則
  • this.cache.poll() 依次拿取頭部數據執行this._write寫入目標文件
  • 緩存隊列poll出來的data如果不存在,則說明是第一次寫入的行為||緩存隊列已清空。this.writing = false; 下次的文件讀取可以直接寫入目標文件
  • 如果this.needDrain又達到預期,文件讀取到數據存放再緩存里 不直接寫入目標文件
clearBuffer() {     //寫入成功后 調用 clearBuffer--》寫入緩存第一個,第一個完成后,再繼續 第二個     let data = this.cache.poll();     // console.log('this.cache',this.cache)     if (data) {       //有值 寫入文件       this._write(data.chunk, data.encoding, data.cb);     } else {       this.writing = false;       if (this.needDrain) {         // 如果是緩存,觸發drain         this.emit("drain");       }     }   }

_write()

  • fs.open()是異步的,成功讀取后fd會是一個number類型
  • 根據fd的type 決定是否訂閱一次open,并回調自己(直到fd類型為number)
  • fd類型為number:調用fs.write,寫入當前的chunk,
 _write(chunk, encoding, cb) {     if (typeof this.fd !== "number") {       return this.once("open", () => this._write(chunk, encoding, cb));     }     fs.write(this.fd, chunk, 0, chunk.length, this.offset, (err, written) => {       this.offset += written; //維護偏移量       this.len -= written; //把緩存的個數減少       cb(); //寫入成功       // console.log(this.cache);     });   }

測試自定義的Writable

const WriteStream = require("./initWriteStream");  let ws = new WriteStream(bPath, {   highWaterMark: 3, });  let i = 0; function write() {   //寫入0-9個   let flag = true;   while (i < 10 && flag) {     flag = ws.write(i++ + "");      console.log(flag);   } } ws.on("drain", function () {   // 只有當我們寫入的數據達到預期,并且數據被清空后才會觸發drain ⌚️   console.log("寫完了");   write(); });  write();
  • 10個數字,依次寫入,3次達到最大預期值,然后依次清空了3次緩存結果符合預期

淺談Nodejs中的可寫流write與實現方法

  • 目標文件中查看是否正確寫入了我們預期的數值

淺談Nodejs中的可寫流write與實現方法

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲一区精品视频在线观看| 日韩不卡一二区| 日本免费成人网| 韩国一区二区在线播放| 中国黄色片一级| 天天干天天色天天干| 男生操女生视频在线观看| 国内外免费激情视频| 十八禁视频网站在线观看| 人妻熟女一二三区夜夜爱| 播放灌醉水嫩大学生国内精品| 日韩精品视频在线观看视频| 成人性免费视频| 无码人妻丰满熟妇区毛片18| 农村妇女精品一二区| 一本色道久久亚洲综合精品蜜桃| 亚洲 激情 在线| 日本一本在线视频| 国产乱人伦精品一区二区三区| 中文字幕无码精品亚洲资源网久久| 欧美午夜性视频| 日韩在线第三页| 一区二区三区四区久久| 青青青在线视频播放| 免费在线观看的毛片| 亚洲男人天堂2021| 六月丁香激情网| 五月婷婷六月丁香激情| 欧美国产视频一区| 欧美精品成人网| 黄色www在线观看| 黄色av网址在线播放| 色免费在线视频| 又大又硬又爽免费视频| 污污视频网站免费观看| 国产高清免费在线| 凹凸国产熟女精品视频| 一区二区三区四区免费观看| 日本三区在线观看| 黄色一级片国产| 亚洲欧美国产中文| 欧美日韩在线一| 黄色网络在线观看| 亚洲综合欧美激情| 99精品人妻少妇一区二区| 亚洲欧美一区二区三区不卡| 99视频在线免费| 屁屁影院ccyy国产第一页| 亚洲一区精品视频在线观看| 欧美日韩中文在线视频| www.avtt| 麻豆映画在线观看| 毛片毛片毛片毛| 国产超碰在线播放| 成人羞羞国产免费网站| 欧美爱爱视频免费看| 肉大捧一出免费观看网站在线播放 | 一道本视频在线观看| 黄色一级视频片| 中文字幕无码精品亚洲资源网久久| 91欧美一区二区三区| 三级av免费观看| 日本中文字幕二区| 中日韩av在线播放| www.se五月| www.久久91| 亚洲高清av一区二区三区| 特级西西444www| 国产欧美激情视频| 国产成人强伦免费视频网站| 欧美一级免费在线| 欧美日韩中文字幕在线播放| 欧美三级午夜理伦三级老人| 国内精品国产三级国产99| 中国一级黄色录像| 久久国产午夜精品理论片最新版本| 国产精品视频二| 久久成人免费观看| 亚洲精品怡红院| 色呦色呦色精品| 黄色一级大片免费| 久久久亚洲精品无码| 国产精品69页| 国内av一区二区| 欧美狂野激情性xxxx在线观| 91猫先生在线| 国产精品自拍视频在线| 日韩中文在线字幕| 国产精品99久久免费黑人人妻| 国产又猛又黄的视频| 国产又黄又爽免费视频| 天天夜碰日日摸日日澡性色av| 成年人在线看片| 手机福利在线视频| 国产精品久久中文字幕| 免费成年人高清视频| 99在线观看视频免费| 天天干天天操天天做| 男人添女荫道口喷水视频| 少妇黄色一级片| 日韩国产一级片| 不卡中文字幕在线观看| 国产中文字幕在线免费观看| 久国产精品视频| 久久久999免费视频| 黄色一级片网址| 熟女人妇 成熟妇女系列视频| 中文字幕在线乱| 亚洲精品怡红院| 欧美 国产 综合| 337p亚洲精品色噜噜狠狠p| 亚洲免费av一区二区三区| 搞av.com| 国产精品波多野结衣| 婷婷激情四射五月天| 国产一区二区三区小说| 国产一级黄色录像片| 亚洲成人福利在线| 国产免费成人在线| 国产 日韩 欧美在线| 亚洲高潮无码久久| 午夜影院免费版| www.五月天色| www.久久久久久久久久久| 在线观看免费成人av| 国产91美女视频| av日韩一区二区三区| 337p亚洲精品色噜噜狠狠p| 久久精品一二三四| 国产又爽又黄ai换脸| 91香蕉视频在线观看视频| 992tv人人草| 99亚洲国产精品| 国产911在线观看| 久久久久久久久影视| 女人色极品影院| 成人污网站在线观看| 婷婷五月综合缴情在线视频| 国产一区二区三区小说| 自拍日韩亚洲一区在线| 欧美 国产 综合| 国产成人精品视频ⅴa片软件竹菊| 欧洲av无码放荡人妇网站| 精品www久久久久奶水| 手机在线看福利| 日韩欧美中文在线视频| www.亚洲成人网| 欧美视频在线播放一区| 一区二区xxx| 日韩第一页在线观看| 欧美国产视频一区| 欧美韩国日本在线| 亚洲黄色av片| 日韩成人三级视频| 日本精品www| 天天摸天天舔天天操| 中国 免费 av| 国产日产欧美视频| 91精品国产三级| 国产精品333| 91小视频在线播放| 国产69精品久久久久999小说| 日韩手机在线观看视频| 亚洲男人天堂2021| 日本福利视频在线| 99亚洲精品视频| 韩国日本美国免费毛片| 日本道在线视频| 国产一线二线三线在线观看| japanese在线播放| 五月天激情视频在线观看| 国产二区视频在线| 在线看免费毛片| 青青草原av在线播放| av 日韩 人妻 黑人 综合 无码| 欧美日韩亚洲第一| 18禁裸男晨勃露j毛免费观看| 中文字幕中文在线| 国产免费成人在线| 菠萝蜜视频在线观看入口| 日韩av自拍偷拍| av五月天在线| 97国产精东麻豆人妻电影 | 激情深爱综合网| 一本二本三本亚洲码| 欧美美女一级片| 国产裸体免费无遮挡| 久色视频在线播放| 97超碰国产精品| 99精品一区二区三区的区别| 日韩在线不卡一区| 国产自偷自偷免费一区 | av片在线免费| 亚洲小说欧美另类激情| 久久人妻无码一区二区| 你真棒插曲来救救我在线观看| 免费av不卡在线| www.欧美激情.com| 国产欧美精品一二三| 日本网站在线看|