Node.js學(xué)習(xí)筆記

原文鏈接:https://www.runoob.com/nodejs/nodejs-stream.html

Package.json 屬性說明

name - 包名迅涮。

version - 包的版本號(hào)膜毁。

description - 包的描述。

homepage - 包的官網(wǎng) url 壁公。

author - 包的作者姓名。

contributors - 包的其他貢獻(xiàn)者姓名。

dependencies - 依賴包列表拥褂。如果依賴包沒有安裝,npm 會(huì)自動(dòng)將依賴包安裝在 node_module 目錄下牙寞。

repository - 包代碼存放的地方的類型饺鹃,可以是 git 或 svn,git 可在 Github 上间雀。

main - main 字段指定了程序的主入口文件翠储,require('moduleName') 就會(huì)加載這個(gè)文件隘道。這個(gè)字段的默認(rèn)值是模塊根目錄下面的 index.js。

keywords - 關(guān)鍵字

Buffer(緩沖區(qū))

JavaScript 語言自身只有字符串?dāng)?shù)據(jù)類型,沒有二進(jìn)制數(shù)據(jù)類型杠娱。但在處理像TCP流或文件流時(shí),必須使用到二進(jìn)制數(shù)據(jù)稽揭。因此在 Node.js中裆悄,定義了一個(gè) Buffer 類,該類用來創(chuàng)建一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)萎庭。

創(chuàng)建 Buffer 類

  • Buffer 提供了以下 API 來創(chuàng)建 Buffer 類:

  • Buffer.alloc(size[, fill[, encoding]]): 返回一個(gè)指定大小的 Buffer 實(shí)例霜医,如果沒有設(shè)置 fill,則默認(rèn)填滿 0

  • Buffer.allocUnsafe(size): 返回一個(gè)指定大小的 Buffer 實(shí)例驳规,但是它不會(huì)被初始化肴敛,所以它可能包含敏感的數(shù)據(jù)

  • Buffer.allocUnsafeSlow(size)

  • Buffer.from(array): 返回一個(gè)被 array 的值初始化的新的 Buffer 實(shí)例(傳入的 array 的元素只能是數(shù)字,不然就會(huì)自動(dòng)被 0 覆蓋)

  • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一個(gè)新建的與給定的 ArrayBuffer 共享同一內(nèi)存的 Buffer吗购。

  • Buffer.from(buffer): 復(fù)制傳入的 Buffer 實(shí)例的數(shù)據(jù)医男,并返回一個(gè)新的 Buffer 實(shí)例

  • Buffer.from(string[, encoding]): 返回一個(gè)被 string 的值初始化的新的 Buffer 實(shí)例

寫入緩沖區(qū)

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

string - 寫入緩沖區(qū)的字符串。

offset - 緩沖區(qū)開始寫入的索引值捻勉,默認(rèn)為 0 镀梭。

length - 寫入的字節(jié)數(shù),默認(rèn)為 buffer.length

encoding - 使用的編碼踱启。默認(rèn)為 'utf8' 报账。

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

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

encoding - 使用的編碼研底。默認(rèn)為 'utf8' 。

start - 指定開始讀取的索引位置透罢,默認(rèn)為 0榜晦。

end - 結(jié)束位置,默認(rèn)為緩沖區(qū)的末尾羽圃。

將 Buffer 轉(zhuǎn)換為 JSON 對(duì)象

buf.toJSON()

當(dāng)字符串化一個(gè) Buffer 實(shí)例時(shí)乾胶,會(huì)隱式地調(diào)用該 toJSON()。

緩沖區(qū)合并

Buffer.concat(list[, totalLength])

var buffer1 = Buffer.from(('菜鳥教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);

緩沖區(qū)比較

buf.compare(otherBuffer);

otherBuffer - 與 buf 對(duì)象比較的另外一個(gè) Buffer 對(duì)象朽寞。
返回一個(gè)數(shù)字识窿,表示 buf 在 otherBuffer 之前,之后或相同愁憔。

實(shí)例
var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
console.log(buffer1 + " 與 " + buffer2 + "相同");
}else {
console.log(buffer1 + " 在 " + buffer2 + "之后");
}

拷貝緩沖區(qū)

buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])

參數(shù)描述如下:

targetBuffer - 要拷貝的 Buffer 對(duì)象腕扶。

targetStart - 數(shù)字, 可選, 默認(rèn): 0

sourceStart - 數(shù)字, 可選, 默認(rèn): 0

sourceEnd - 數(shù)字, 可選, 默認(rèn): buffer.length

實(shí)例

var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
//將 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);
console.log(buf1.toString());
執(zhí)行以上代碼,輸出結(jié)果為:

abRUNOOBijkl

緩沖區(qū)裁剪

buf.slice([start[, end]])

參數(shù)描述如下:

start - 數(shù)字, 可選, 默認(rèn): 0

end - 數(shù)字, 可選, 默認(rèn): buffer.length

返回值
返回一個(gè)新的緩沖區(qū)吨掌,它和舊緩沖區(qū)指向同一塊內(nèi)存半抱,但是從索引 start 到 end 的位置剪切。

實(shí)例
var buffer1 = Buffer.from('runoob');
// 剪切緩沖區(qū)
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());
執(zhí)行以上代碼膜宋,輸出結(jié)果為:
buffer2 content: ru

緩沖區(qū)長度

buf.length;

返回值
返回 Buffer 對(duì)象所占據(jù)的內(nèi)存長度窿侈。

Stream(流)

Stream 是一個(gè)抽象接口,Node 中有很多對(duì)象實(shí)現(xiàn)了這個(gè)接口秋茫。例如史简,對(duì)http 服務(wù)器發(fā)起請(qǐng)求的request 對(duì)象就是一個(gè) Stream,還有stdout(標(biāo)準(zhǔn)輸出)肛著。

Node.js圆兵,Stream 有四種流類型:

Readable - 可讀操作。

Writable - 可寫操作枢贿。

Duplex - 可讀可寫操作.

Transform - 操作被寫入數(shù)據(jù)殉农,然后讀出結(jié)果。

所有的 Stream 對(duì)象都是 EventEmitter 的實(shí)例局荚。常用的事件有:

data - 當(dāng)有數(shù)據(jù)可讀時(shí)觸發(fā)超凳。

end - 沒有更多的數(shù)據(jù)可讀時(shí)觸發(fā)。

error - 在接收和寫入過程中發(fā)生錯(cuò)誤時(shí)觸發(fā)耀态。

finish - 所有數(shù)據(jù)已被寫入到底層系統(tǒng)時(shí)觸發(fā)轮傍。

從流中讀取數(shù)據(jù)

var fs = require("fs");
var readerStream = fs.createReadStream('input.txt');

寫入流

var fs = require("fs");
var writerStream = fs.createWriteStream('output.txt');

管道流

管道提供了一個(gè)輸出流到輸入流的機(jī)制。通常我們用于從一個(gè)流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個(gè)流中首装。
var fs = require("fs");
var readerStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
// 管道讀寫操作
// 讀取 input.txt 文件內(nèi)容创夜,并將內(nèi)容寫入到 output.txt 文件中
readerStream.pipe(writerStream);

鏈?zhǔn)搅?/h6>

鏈?zhǔn)绞峭ㄟ^連接輸出流到另外一個(gè)流并創(chuàng)建多個(gè)流操作鏈的機(jī)制。鏈?zhǔn)搅饕话阌糜诠艿啦僮?br> var fs = require("fs");
var zlib = require('zlib');
// 壓縮 input.txt 文件為 input.txt.gz
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log("文件壓縮完成仙逻。");

Node.js模塊系統(tǒng)

var hello = require('./hello');
hello.world();
exports.world = function() {
console.log('Hello World');
}

//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();

#######exports 和 module.exports 的使用

如果要對(duì)外暴露屬性或方法挥下,就用 exports 就行揍魂,要暴露對(duì)象(類似class,包含了很多屬性和方法)棚瘟,就用 module.exports。

Node.js 文件系統(tǒng)

Node.js 提供一組類似 UNIX(POSIX)標(biāo)準(zhǔn)的文件操作API喜最。 Node 導(dǎo)入文件系統(tǒng)模塊(fs)語法如下所示:
var fs = require("fs")

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偎蘸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞬内,更是在濱河造成了極大的恐慌迷雪,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虫蝶,死亡現(xiàn)場離奇詭異章咧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)能真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門赁严,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粉铐,你說我怎么就攤上這事疼约。” “怎么了蝙泼?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汤踏。 經(jīng)常有香客問我,道長溪胶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任载荔,我火速辦了婚禮盾饮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懒熙。我一直安慰自己,他們只是感情好工扎,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肢娘,像睡著了一般呈础。 火紅的嫁衣襯著肌膚如雪舆驶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天而钞,我揣著相機(jī)與錄音,去河邊找鬼臼节。 笑死,一個(gè)胖子當(dāng)著我的面吹牛网缝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粉臊,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼远寸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起犀盟,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阅畴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贱枣,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年钠乏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓避。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡只壳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吼句,到底是詐尸還是另有隱情,我是刑警寧澤惕艳,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布驹愚,位于F島的核電站劣纲,受9級(jí)特大地震影響逢捺,放射性物質(zhì)發(fā)生泄漏味廊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一余佛、第九天 我趴在偏房一處隱蔽的房頂上張望窍荧。 院中可真熱鬧,春花似錦蕊退、人聲如沸郊楣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至输硝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間点把,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工哥童, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贮懈。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像优训,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子型宙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,340評(píng)論 0 6
  • chapter 2 JavaScript概覽 介紹 js是基于原型,面向?qū)ο螅?弱類型的的動(dòng)態(tài)腳本語言妆兑。 Java...
    ShallLi閱讀 1,494評(píng)論 1 2
  • 一毛仪、模塊1. 在Node環(huán)境中芯勘,一個(gè).js文件就稱之為一個(gè)模塊(module)箱靴。2. 模塊化的優(yōu)點(diǎn):提高代碼的可維...
    YoungEvita閱讀 1,540評(píng)論 0 0
  • 資源引用 node.js 是跨平臺(tái)的荷愕,所以為了不同平臺(tái)都可以使用路徑,我們一般用./表示當(dāng)前路徑 圖片以及 htm...
    GodlinE閱讀 271評(píng)論 0 0
  • 個(gè)人入門學(xué)習(xí)用筆記抛杨、不過多作為參考依據(jù)。如有錯(cuò)誤歡迎斧正 目錄 簡書好像不支持錨點(diǎn)怖现、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,479評(píng)論 1 37