nodeJs學(xué)習(xí)筆記(4) --- Stream

Buffer

Buffer 用來創(chuàng)建專門存放二進制的一個緩存區(qū)。Buffer庫為Node帶來一種原始儲存數(shù)據(jù)的方法,可以處理二進制數(shù)據(jù)先朦。

創(chuàng)建Buffer

1.var buf = new Buffer(10);
2.var buf = new Buffer([10, 20, 30, 40, 50]);
3.var buf = new Buffer("www.runoob.com", "utf-8");

utf-8 是默認的編碼方式祈惶,此外它同樣支持以下編碼:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"柒瓣。

寫入 Node 緩沖區(qū)的語法

buf.write(string[, offset[, length]][, encoding]);

從緩沖區(qū)讀取數(shù)據(jù)

buf.toString([encoding[, start[, end]]]);

其他方法

// 將buffer轉(zhuǎn)成Json對象
buf.toJSON();  
//緩沖區(qū)合并                   
Buffer.concat(list[, totalLength]); 
// 緩沖區(qū)比較
buf.compare(otherBuffer);    
//拷貝緩沖區(qū)       
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]);
//緩沖區(qū)裁剪
buf.slice([start[, end]]);
//緩沖區(qū)長度
but.length;

示例代碼如下:

var fs = require('fs');
fs.readFile('logo.png', function(err, origin_buffer) {
    // 文件系統(tǒng)中傳入的data就是二進制數(shù)據(jù)
    console.log(Buffer.isBuffer(origin_buffer));
    fs.writeFile('logo_buffer.jpg', origin_buffer, function(err) {
        if(err) console.log(err);
    })
    // 將Buffer轉(zhuǎn)成'base64'編碼的數(shù)據(jù)
    var base64Image = origin_buffer.toString('base64');

    console.log(base64Image);

    // 解碼數(shù)據(jù) 轉(zhuǎn)回二進制
    var decodeImage = new Buffer(base64Image, 'base64');
    console.log(Buffer.compare(origin_buffer, decodeImage));

    fs.writeFile('logo_buffer.jpg', decodeImage, function(err) {
        if(err) console.log(err);
    })
})

Stream

Stream 是一個抽象接口,Node 中有很多對象實現(xiàn)了這個接口撵枢。例如民晒,對http 服務(wù)器發(fā)起請求的request 對象就是一個 Stream,還有stdout(標(biāo)準(zhǔn)輸出)诲侮。

Node.js镀虐,Stream 有四種流類型:
Readable - 可讀操作。
Writable - 可寫操作沟绪。
Duplex - 可讀可寫操作.
Transform - 操作被寫入數(shù)據(jù)刮便,然后讀出結(jié)果。

所有的 Stream 對象都是 EventEmitter 的實例绽慈。常用的事件有:
data - 當(dāng)有數(shù)據(jù)可讀時觸發(fā)恨旱。
end - 沒有更多的數(shù)據(jù)可讀時觸發(fā)辈毯。
error - 在接收和寫入過程中發(fā)生錯誤時觸發(fā)。
finish - 所有數(shù)據(jù)已被寫入到底層系統(tǒng)時觸發(fā)搜贤。

自己定制Stream

var stream = require('stream');
var util = require('util');

// 自己定制的讀入流構(gòu)造函數(shù)
function ReadStream() {
    stream.Readable.call(this);
}
// 復(fù)制可讀流的屬性
util.inherits(ReadStream, stream.Readable);
// 定義read方法

ReadStream.prototype._read = function() {
    this.push('I');
    this.push('Love');
    this.push('Jocelyn\n');
    this.push(null);
};
// 自己定制的可寫流構(gòu)造函數(shù)
function writStream() {
    stream.Writable.call(this);
    this._cache = new Buffer('');
}
// 復(fù)制可寫流的屬性
util.inherits(writStream, stream.Writable);
// 定義write方法
writStream.prototype._write = function(chunk, encode, cb) {
    console.log(chunk.toString());
    cb();
}

function TransformStream() {
    stream.Transform.call(this);
}

util.inherits(TransformStream, stream.Transform);

TransformStream.prototype._transform = function(chunk, encode, cb) {
    this.push(chunk);
    cb();
}

TransformStream.prototype._flush = function(cb) {
    this.push('Oh Yeah!');
    cb();
}

var rs = new ReadStream();
var ws = new writStream();
var ts = new TransformStream();

rs.pipe(ts).pipe(ws);

pipe

上面例子有用到pipe(管道)谆沃,其實就是說從一個容器流入另一個容器的管道, rs.pipe(ws) 管道提供了一個輸出流到輸入流的機制仪芒。通常我們用于從一個流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個流中唁影。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掂名,隨后出現(xiàn)的幾起案子据沈,更是在濱河造成了極大的恐慌,老刑警劉巖饺蔑,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌介,死亡現(xiàn)場離奇詭異,居然都是意外死亡猾警,警方通過查閱死者的電腦和手機孔祸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來发皿,“玉大人崔慧,你說我怎么就攤上這事■撸” “怎么了尊浪?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長封救。 經(jīng)常有香客問我拇涤,道長,這世上最難降的妖魔是什么誉结? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任鹅士,我火速辦了婚禮,結(jié)果婚禮上惩坑,老公的妹妹穿的比我還像新娘掉盅。我一直安慰自己,他們只是感情好以舒,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布趾痘。 她就那樣靜靜地躺著,像睡著了一般蔓钟。 火紅的嫁衣襯著肌膚如雪永票。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音侣集,去河邊找鬼键俱。 笑死,一個胖子當(dāng)著我的面吹牛世分,可吹牛的內(nèi)容都是我干的编振。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臭埋,長吁一口氣:“原來是場噩夢啊……” “哼踪央!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斋泄,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤杯瞻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炫掐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡睬涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年募胃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦浓。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痹束,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讶请,到底是詐尸還是另有隱情祷嘶,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布夺溢,位于F島的核電站论巍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏风响。R本人自食惡果不足惜嘉汰,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望状勤。 院中可真熱鬧鞋怀,春花似錦、人聲如沸持搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葫盼。三九已至残腌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背废累。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工邓梅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邑滨。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓日缨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掖看。 傳聞我的和親對象是個殘疾皇子匣距,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,331評論 0 6
  • stream 流是一個抽象接口,在 Node 里被不同的對象實現(xiàn)哎壳。例如 request to an HTTP se...
    明明三省閱讀 3,404評論 1 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理毅待,服務(wù)發(fā)現(xiàn),斷路器归榕,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 流是Node中最重要的組件和模式之一尸红。在社區(qū)里有一句格言說:讓一切事務(wù)流動起來。這已經(jīng)足夠來描述在Node中流...
    宮若石閱讀 552評論 0 0
  • 模塊 名詞解釋:每一個js文件就是一個模塊刹泄,而文件路徑就是模塊名外里。每個模塊(也就是每個js文件)都有requir,...
    親愛的孟良閱讀 520評論 0 0