摘要:在學習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內建分析模...