摘要:則會立馬再次讀取填滿最高水位線可寫流這個方法向底層系統寫入數據,并在數據處理完畢后調用所給的回調。返回值表示你是否應該繼續立即寫入。最好的辦法是等待事件后,再寫入數據。緩存區未滿寫入方法是同步的,但是寫入文件的過程異步的。
Stream流有以下四種類型:
Readable - 可讀操作
Writable - 可寫操作
Duplex - 可讀可寫操作
Transform - 操作被寫入數據,然后讀出結果
可讀流(Readable stream)可讀流(Readable stream)接口是對你正在讀取的數據的來源的抽象。換句話說,數據來來自可讀流(Readable stream)不會分發數據,直到你表明準備就緒。
可讀流(Readable stream) 有2種模式: 流動模式(flowing mode) 和 暫停模式(paused mode). 流動模式(flowing mode)時,盡快的從底層系統讀取數據并提供給你的程序。 暫停模式(paused mode)時, 你必須明確的調用 stream.read() 來讀取數據。 暫停模式(paused mode) 是默認模式。
可以通過下面幾個方法,將流切換到流動模式(flowing mode)。
let fs = require("fs"); /** * 所有初始工作模式為 paused 的 Readable 流,可以通過下面三種途徑切換到 flowing 模式: 監聽 "data" 事件 調用 stream.resume() 方法 調用 stream.pipe() 方法將數據發送到 Writable */ let rs = fs.createReadStream("./1.txt",{ highWaterMark:3 }); /* 269 stream.emit("data", chunk); stream.read(0); rs.on("data",function (data) { console.log(data); }); rs.on("end",function () { console.log("end"); });*/ //當你監聽 readable事件的時候,會進入暫停模式 //當監聽readable事件的時候,可讀流會馬上去向底層讀取文件,然后把讀到文件的文件放在緩存區里const state = this._readableState; //self.read(0); 只填充緩存,但是并不會發射data事件,但是會發射stream.emit("readable");事件 //this._read(state.highWaterMark); 每次調用底層的方法讀取的時候是讀取3個字節 rs.on("readable",function(){ //length就是指得緩存區數據的大小 // state.length += chunk.length;==3 console.log(rs._readableState.length); //read如果不加參數表示讀取整個緩存區數據 //讀取一個字段,如果可讀流發現你要讀的字節小于等于緩存字節大小,則直接返回 let ch = rs.read(1); console.log(ch); console.log(rs._readableState.length); /* ch = rs.read(1); console.log(ch); console.log(rs._readableState.length);*/ //當你讀完指定的字節后,如果可讀流發現剩下的字節已經比最高水位線小了。則會立馬再次讀取填滿 最高水位線 setTimeout(function(){ console.log(rs._readableState.length); },200) });可寫流(Writable stream )
這個方法向底層系統寫入數據,并在數據處理完畢后調用所給的回調。返回值表示你是否應該繼續立即寫入。如果數據要緩存在內部,將會返回false。否則返回 true。返回值僅供參考。即使返回 false,你也可能繼續寫。但是寫會緩存在內存里,所以不要做的太過分。最好的辦法是等待drain 事件后,再寫入數據。
let fs = require("fs"); let ws = fs.createWriteStream("2.txt",{ flags:"w", mode:0o666, start:0, highWaterMark:3 }); let count = 9; function write(){ let flag = true;//緩存區未滿 //寫入方法是同步的,但是寫入文件的過程 異步的。在真正寫入文件后還會執行我們的回調函數 while(flag && count>0){ console.log("before",count); flag = ws.write((count)+"","utf8",(function (i) { return ()=>console.log("after",i); })(count)); count--; } } write();//987 //監聽緩存區清空事件 ws.on("drain",function () { console.log("drain"); write();//654 321 }); ws.on("error",function (err) { console.log(err); }); //如果已經不再需要寫入了,可以調用end方法關閉寫入流,一旦調用end方法之后則不能再寫入 ws.end(); //write after end // ws.write("x");雙工流(Duplex streams)
雙工流(Duplex streams)是同時實現了?Readable?and?Writable?接口。用法詳見下文
let {Duplex} = require("stream"); let index = 0; let s = Duplex({ read(){ if(index++<3) this.push("a"); else this.push(null); }, write(chunk,encoding,cb){ console.log(chunk.toString().toUpperCase()); cb(); } }); //process.stdin 標準輸入流 //proces.stdout標準輸出流 process.stdin.pipe(s).pipe(process.stdout);轉換流(Transform streams)
它的輸出是從輸入計算得來。 它實現了Readable?和?Writable?接口. 用法詳見下文.
let {Transform} = require("stream"); //轉換流是實現數據轉換的 let t = Transform({ transform(chunk,encoding,cb){ this.push(chunk.toString().toUpperCase()); cb(); } }); process.stdin.pipe(t).pipe(process.stdout);
let {Transform} = require("stream"); let fs = require("fs"); let rs = fs.createReadStream("./user.json"); //普通流里的放的是Buffer,對象流里放的對象 let toJSON = Transform({ readableObjectMode:true,//就可以向可讀流里放對象 transform(chunk,encoding,cb){ //向可讀流里的緩存區里放 this.push(JSON.parse(chunk.toString())); } }); let outJSON = Transform({ writableObjectMode:true,//就可以向可讀流里放對象 transform(chunk,encoding,cb){ console.log(chunk); cb(); } }); rs.pipe(toJSON).pipe(outJSON);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107185.html
摘要:原文前面可以說是弄了一系列的和多進程的一大坨內容,知識淺顯代碼粗暴風格簡陋,總的說來,還是差了一些細節。今天,就一些漏掉的細節補充一下。最后,我補充一句是同步的,而不是異步。 原文:https://t.ti-node.com/thread/... 前面可以說是弄了一系列的php socket和多進程的一大坨內容,知識淺顯、代碼粗暴、風格簡陋,總的說來,還是差了一些細節。今天,就一些漏...
摘要:原文地址的中文名字叫做套接字,這種東西就是對的封裝。運行結果如下簡單解析一下上述代碼來說明一下服務器的流程首先,根據協議族或地址族套接字類型以及具體的的某個協議來創建一個。很容易受到攻擊,造成拒絕服務。 [原文地址:https://blog.ti-node.com/blog...] socket的中文名字叫做套接字,這種東西就是對TCP/IP的封裝。現實中的網絡實際上只有四層而已,從上...
摘要:原文地址在初探先從一個簡單的服務器開始中依次講解了三個逐漸進步的服務器只能服務于一個客戶端的服務器利用可以服務于多個客戶端的額服務器利用預派生進程服務于多個客戶端的服務器最后一種服務器的進程模型基本上的大概原理其實跟我們常用的是非常 [原文地址:https://blog.ti-node.com/blog...] 在<PHP socket初探 --- 先從一個簡單的socket服務器開始...
摘要:前言本項目旨在從零到壹,制作一款界面精美的聊天軟件。因為本人是開發,設計功底欠缺,所以軟件設計的有點丑,如果有大神有更好的,歡迎。 Hola 前言 本項目旨在從零到壹,制作一款界面精美的聊天軟件。 Github 地址因為已工作,所以可能沒有多少時間來繼續跟進這個項目了,項目可優化的點已在下文列出,歡迎大家 Fork 或 Star。 ps: 征 logo 一枚。因為本人是開發,設計功底...
閱讀 1446·2021-11-24 09:39
閱讀 3626·2021-09-29 09:47
閱讀 1571·2021-09-29 09:34
閱讀 3067·2021-09-10 10:51
閱讀 2536·2019-08-30 15:54
閱讀 3216·2019-08-30 15:54
閱讀 869·2019-08-30 11:07
閱讀 1004·2019-08-29 18:36