確認過眼神,你是喜歡Stream的人

2022-05-22 17:57:12 字數 2591 閱讀 4817

摘要:在學習node的過程中,stream流是常用的東東,在了解怎麼使用它的同時,我們應該要深入了解它的具體實現。今天的主要帶大家來寫一寫可讀流的具體實現,就過來,就過來,上碼啦!

初始化引數

開啟檔案

讀取檔案

結束,關閉檔案

var readstream=require('readstream.js');

var rs=new readstream('test.txt',);

rs.on('data',function(data))
1.因為我們以檔案的可讀流來做的,在此我們要引入乙個檔案模組。還有乙個事件模組,並且要繼承它,每乙個可讀流都是『events』的乙個例項。

首先我們先初始化引數:

var fs=require('fs');

var eventemitter=require('events');

class readstream extends eventemitter

}

以上除了初始化傳遞進來的引數,還加了幾個pos,buffer,open(),flowing,為什麼要加這些呢?這些值是來做什麼用的?我們在此做出解答:

2.讀取乙個檔案應該先開啟檔案,我們來定義該方法:

open()

this.fd=fd;

this.emit('open');

});}

2.1在開啟檔案的時候,如果檔案開啟報錯,我們除了要觸發錯誤事件外,還要注意乙個引數。autoclose是指在檔案讀取完畢或丟擲錯誤後,自己關閉檔案。

於是我們根據這個引數值,在現有的open方法中對拋錯的情況做出優化。

open());

}this.emit('close');

}this.emit('err');

}this.fd=fd;

this.emit('open');

})}

3.開啟檔案後,並不是立馬讀取,而是要檢查是否有data事件繫結監聽!

對此,我們要在建構函式內檢查如果新增了data的事件監聽

class readstream extends eventemitter})}

}

完成以上步驟後,我們要做的就是讀取檔案內容啦,下面來自定義乙個read方法:

read());

}this.emit('close');}}

if(flowing)

}else);

}this.emit('close');}}

})}

到此,乙個read方法就寫的差不多了,但是有個問題是要注意的,open方法是非同步的,有可能出現呼叫read方法時,this.fd還沒有值。為了避免這個錯誤,我們改寫一下read方法。

read()

...}

這樣的話,乙個基礎的readstream類才算寫完整。我們是不是要考慮下,有沒有什麼可以優化的地方?細心的夥伴是不是發現有重複的**?

對,就是檔案的關閉,我們提出乙個destory方法,用作關閉檔案。

destory());

return ;

}this.emit('close');

}}

方法的呼叫介紹變數flowing時,我們有提到'暫停'方法pause(),'重啟'方法resume()來改變flowing的值。我們加入到**中。

首先加入呼叫,我們在第一次讀取資料後暫停讀取,在3秒後繼續讀取。

rs.on('data',(data)=>);

settimeout(()=>,3000)

這兩個方法的呼叫也是一樣簡單:

pause()

resume()

ok,大功告成了,下面整理出完整**

var fs=require('fs');

var eventemitter=require('events');

class readstream extends eventemitter

});open()

this.emit('err',err);

return ;

}this.fd=fd;

this.emit('open');

});}

destory());

return ;

}this.emit('close');

}read()

let howtolength=this.end ? math.min((this.end-this.pos),this.highwatermark) : this.highwatermark;

fs.read(this.fd,this.buffer,0,howtolenghth,this.pos,(err,bytesbase)=>

if(flowing)

}else

})

}pause()

resume()

}}

確認過眼神,遇上IT人

突發感想寫點東西,不是為培訓出來的人正名的,只是 想以乙個剛培訓出來的人的身份說說感受。說說培訓的初衷 自學,說實話,怕自己自制力不夠,而且也容易學著學著丟了方向。選擇培訓能夠讓自己比較專注高效的學習。主要是有人規劃方向,學畢竟是靠自己去理解去敲 的。萬事開頭難,只是想讓入行 系統一點。培訓帶來的,...

確認過眼神,看清 HTTP 協議

在了解http之前,我們需要了解什麼是網路通訊模型 也就是我們常說的 osi 模型 osi 模型是對網路中資料是如何被傳送和接收的乙個具象化的展示,如下圖展示 在 osi 中我們所處在最頂層,我們所有的網路的行為,資料的傳遞都是從頂至下然後在從下至頂完成一次傳遞的。每一層都會有對應的一些協議,協議就...

確認過眼神,你就是對的預算分析 全面預算

今天是f one全面預算小課堂系列的最後一篇啦 關於預算分析那些事兒。全面預算是乙個從定目標 編制到結果分析的全流程控制過程,與純業務的預算軟體不同,f one全面預算的價值不僅僅是預算的填報和審批,還能對預算進行分析,預算分析是對整個預算過程的一次綜合解析。分析為了更好地優化 f one內建分析模...