node流處理(stream && buffer)

在Node中,應用需要處理網(wǎng)絡協(xié)議贴彼、操作數(shù)據(jù)庫、處理圖片强岸、接收上傳文件等,在網(wǎng)絡流和文件的操作中砾赔,還要處理大量二進制數(shù)據(jù)蝌箍,JavaScript語言沒有讀取或操作二進制數(shù)據(jù)流的機制青灼。

Buffer 類的實例類似于從 0 到 255 之間的整數(shù)數(shù)組(其他整數(shù)會通過 & 255 操作強制轉換到此范圍),但對應于 V8 堆外部的固定大小的原始內存分配妓盲。 Buffer 的大小在創(chuàng)建時確定杂拨,且無法更改。
Buffer 類在全局作用域中悯衬,因此無需使用 require('buffer').Buffer弹沽。
Buffer的創(chuàng)建:

//Buffer.from()、Buffer.alloc() 與 Buffer.allocUnsafe()

let buffer = Buffer.from('23');
console.log(buffer);

const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);   //使用一個8位字節(jié)的數(shù)組分配一個新的 Buffer筋粗。
console.log(buf.toString());

const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
const buf = Buffer.from(arr.buffer); // shares the memory with arr;
console.log(buf);    //<Buffer 88 13 a0 0f>
arr[1] = 7000;
console.log(buf);   //<Buffer 88 13 58 1b>


let buffer = Buffer.alloc(10);  // 創(chuàng)建一個長度為 10策橘、且用零填充的 Buffer。
//<Buffer 00 00 00 00 00 00 00 00 00 00>

Buffer.concat(list[, totalLength]);
返回一個合并了 list 中所有 Buffer 實例的新 Buffer娜亿。
如果 list 中沒有元素丽已、或 totalLength 為 0,則返回一個長度為 0 的 Buffer买决。

const buf1 = Buffer.alloc(10, 0);
const buf2 = Buffer.alloc(14, 0);
const buf3 = Buffer.alloc(18, 0);
const totalLength = buf1.length+buf2.length+buf3.length;

console.log(totalLength);
const bufa = Buffer.concat([buf1, buf2, buf3], totalLength);
console.log(bufa);
console.log(bufa.length);
//42
//<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
//42

buf.write(string[, offset[, length]][, encoding]);
將sring寫入buf實例沛婴,同時返回寫入的字節(jié)數(shù)。
參數(shù)如下:
string:寫入的字符串督赤。
offset:從buf的第幾位開始寫入嘁灯,默認是0。
length:寫入多少個字節(jié)躲舌,默認是 buf.length - offset丑婿。
encoding:字符串的編碼,默認是utf8孽糖。

var buff = Buffer.alloc(4);
buff.write('a');  // 返回 1
console.log(buff);  // 打印 <Buffer 61 00 00 00>

buff.write('ab');  // 返回 2
console.log(buff);  // 打印 <Buffer 61 62 00 00>

buf.toString([encoding[, start[, end]]])枯冈; 轉成字符串

var buff = Buffer.from('hello');
console.log( buff.toString() );  // hello
console.log( buff.toString('utf8', 0, 2) );  // he

buf.toJSON() 轉成JSON字符串

var buff = Buffer.from('hello');
console.log( buff.toJSON() );  // { type: 'Buffer', data: [ 104, 101, 108, 108, 111 ] }

stream是一個抽象接口,該抽象接口是可讀办悟、可寫或是既可讀又可寫的尘奏,通過這些接口,我們可以和磁盤文件病蛉、套接字炫加、HTTP請求來交互,實現(xiàn)數(shù)據(jù)從一個地方流動到另一個地方的功能铺然。
所有的Stream對象都是EventEmitter的實例俗孝,常用的事件有四個:
data-當有數(shù)據(jù)可讀時觸發(fā)
end-當沒有數(shù)據(jù)可讀時觸發(fā)
error-在接受和寫入過程中發(fā)生錯誤時觸發(fā)
finish-當所有的數(shù)據(jù)已經(jīng)寫入到底層系統(tǒng)時觸
流讀取:

const  fs = require('fs');
const readStream = fs.createReadStream('./test.txt');

let data = '';
readStream.setEncoding('utf8');
readStream.on('data', function(chunk){
      data+=chunk;    
});
readStream.on('end', function(){
     console.log(data);
    console.log('流讀取結束');
});
readStream.on('error', function(err){
    console.log(err);
});
console.log('執(zhí)行結束魄健!');

寫入流:

const  fs = require('fs');

const writeStream = fs.createWriteStream('./test.txt',{'flags':'a'});
let data = '測試內容8陈痢!沽瘦!';
writeStream.write(data, 'utf8');
writeStream.end();

writeStream.on('finish', function(){
        console.log('寫入結束革骨!');
});
writeStream.on('error', function(err){
      console.log(err);
});
console.log('執(zhí)行結束!!!!!');

管道流:管道提供一種輸出流到輸入流的機制农尖,通常用于從一個流中獲取數(shù)據(jù)到另一個流中。

const fs = require('fs');

const readStream = fs.createReadStream('./a.txt');
readStream.setEncoding('utf8');

const writeStream = fs.createWriteStream('./b.txt');
readStream.pipe(writeStream);
console.log('執(zhí)行結束A颊堋盛卡!');
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筑凫,隨后出現(xiàn)的幾起案子滑沧,更是在濱河造成了極大的恐慌,老刑警劉巖巍实,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滓技,死亡現(xiàn)場離奇詭異,居然都是意外死亡蔫浆,警方通過查閱死者的電腦和手機殖属,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓦盛,“玉大人洗显,你說我怎么就攤上這事≡罚” “怎么了挠唆?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘱吗。 經(jīng)常有香客問我玄组,道長,這世上最難降的妖魔是什么谒麦? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任俄讹,我火速辦了婚禮,結果婚禮上绕德,老公的妹妹穿的比我還像新娘患膛。我一直安慰自己,他們只是感情好耻蛇,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布踪蹬。 她就那樣靜靜地躺著,像睡著了一般臣咖。 火紅的嫁衣襯著肌膚如雪跃捣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天夺蛇,我揣著相機與錄音疚漆,去河邊找鬼。 笑死,一個胖子當著我的面吹牛娶聘,可吹牛的內容都是我干的灵临。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趴荸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宦焦?” 一聲冷哼從身側響起发钝,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波闹,沒想到半個月后酝豪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡精堕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年孵淘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歹篓。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘫证,死狀恐怖,靈堂內的尸體忽然破棺而出庄撮,到底是詐尸還是另有隱情背捌,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布洞斯,位于F島的核電站毡庆,受9級特大地震影響,放射性物質發(fā)生泄漏烙如。R本人自食惡果不足惜么抗,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亚铁。 院中可真熱鬧蝇刀,春花似錦、人聲如沸刀闷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸昏。三九已至顽分,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間施蜜,已是汗流浹背卒蘸。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缸沃。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓恰起,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趾牧。 傳聞我的和親對象是個殘疾皇子检盼,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容

  • Node.js Buffer(緩沖區(qū)) JavaScript 語言自身只有字符串數(shù)據(jù)類型,沒有二進制數(shù)據(jù)類型翘单。但在...
    FTOLsXD閱讀 508評論 0 2
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,330評論 0 6
  • Buffer是node的核心模塊吨枉,開發(fā)者可以利用它來處理二進制數(shù)據(jù),比如文件流的讀寫哄芜、網(wǎng)絡請求數(shù)據(jù)的處理等貌亭。 Bu...
    自度君閱讀 504評論 0 1
  • JavaScript 語言自身只有字符串數(shù)據(jù)類型,沒有二進制數(shù)據(jù)類型认臊。 但在處理像TCP流或文件流時圃庭,必須使用到二...
    acc8226閱讀 567評論 0 0
  • 山茶木槿牡丹花,春雨如酥尚未干失晴。 游人只愛櫻如雪剧腻,不識花魁自在開。
    33爾來閱讀 263評論 0 1