Node.js基礎(chǔ)入門之緩存區(qū)與文件操作詳解
經(jīng)過前面三天的學(xué)習(xí),Node.js的基礎(chǔ)知識已逐漸掌握,今天繼續(xù)學(xué)習(xí)緩存區(qū)和文件操作,并稍加整理加以分享,如有不足之處,還請指正。
緩存區(qū)
1. 什么是緩存區(qū)?
JavaScript語言自身只有基本數(shù)據(jù)類型(如:字符串),沒有二進(jìn)制數(shù)據(jù)類型。二進(jìn)制數(shù)據(jù)可以存儲電腦中任何數(shù)據(jù)(如:一段文本,一張圖片等)。Node.js作為服務(wù)端,在處理TCP網(wǎng)絡(luò)流或文件流時(shí),必須使用到二進(jìn)制數(shù)據(jù)。因此在Node.js中定義了一個(gè)Buffer類,用來創(chuàng)建一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。所以緩存區(qū)就是在內(nèi)存中開辟一個(gè)臨時(shí)用于存儲需要運(yùn)算的字節(jié)碼的區(qū)域。
2. 創(chuàng)建指定長度的緩存區(qū)
在Node.js中提供了一個(gè)Buffer對象,可以直接創(chuàng)建指定長度的緩存區(qū),如下所示:
var buffer = Buffer.alloc(10);; buffer.write('abcdefghij'); console.log(buf);
示例輸出結(jié)果,如下所示:
通過以上示例可以看出,寫入的一串英文字符,在緩存區(qū)中是以十六進(jìn)制格式顯示的。
關(guān)于字符的十六進(jìn)行表示,可以參考ASCII ((American Standard Code for Information Interchange): 美國信息交換標(biāo)準(zhǔn)代碼)。
ASCII ((American Standard Code for Information Interchange): 美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是最通用的信息交換標(biāo)準(zhǔn),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646。ASCII第一次以規(guī)范標(biāo)準(zhǔn)的類型發(fā)表是在1967年,最后一次更新則是在1986年,到目前為止共定義了128個(gè)字符 [1] 。示例如下所示:
在緩存區(qū)存儲漢字的時(shí)候,也會轉(zhuǎn)換成UTF-8編碼的字節(jié)碼,并以十六進(jìn)制表示,如下所示:
var buffer = Buffer.alloc(10); buffer.write('張三'); console.log(buffer);
示例如下所示:
通過以上示例,可以看出,在Node.js中,采用UTF-8編碼,1個(gè)英文字符占1個(gè)字節(jié);1個(gè)中文漢字3-4個(gè)字節(jié)(UTF-8編碼是變長的)。
3. 通過數(shù)組創(chuàng)建緩存區(qū)
在Node.js中,通過數(shù)組創(chuàng)建緩存區(qū),如下所示:
var buffer = Buffer.from([97,98,99,100,101,102]); console.log(buffer); console.log(buffer.toString());
示例結(jié)果如下:
通過以上示例看出,數(shù)組的格式是十進(jìn)制整數(shù),存儲到緩存區(qū)時(shí),轉(zhuǎn)換成了十六進(jìn)行表示。
4. 通過字符串創(chuàng)建緩存區(qū)
Buffer.from方法,不僅可以通過數(shù)組創(chuàng)建,還可以傳入字符串內(nèi)容,如下所示:
var buffer = Buffer.from("我是小六子呀!"); console.log(buffer); console.log(buffer.toString());
示例結(jié)果如下所示:
5. 讀寫緩存區(qū)
在Node.js中,通過toString方法讀取緩存區(qū)的內(nèi)容,通過write方法寫入緩存區(qū)。如下所示:
var buffer = Buffer.alloc(10); buffer.write('張三'); console.log(buffer.toString());
示例如下:
6. 復(fù)制緩存區(qū)
通過copy方法,可以將緩存區(qū)內(nèi)容從一個(gè)緩存區(qū)拷貝到新的緩存區(qū)。如下所示:
var buffer = Buffer.from("我是小六子呀!"); var buffer2 = Buffer.alloc(21); console.log("復(fù)制前",buffer2); buffer.copy(buffer2); console.log("復(fù)制后:",buffer2);
示例結(jié)果如下所示:
文件操作
Node.js作為服務(wù)端程序,新增了讀取文件操作。文件I/O操作是對標(biāo)準(zhǔn)POSIX函數(shù)的簡單封裝,通過require('fs')使用該模塊,所有方法都有同步和異步的方式。讀寫文件主要有兩種方式:a.直接讀取,b.流式讀取
1. 異步直接讀取
將硬盤上的所有內(nèi)容全部讀入內(nèi)存以后才觸發(fā)回調(diào)函數(shù)。如下所示:
var fs =require('fs'); fs.readFile('./test.txt',function(err,data){ if(err){ console.log(err); }else{ console.log(data.toString());//默認(rèn)data為Buffer類型 } });
示例如下所示:
2. 同步直接讀取
同步方式直接返回?cái)?shù)據(jù)內(nèi)容,不再使用回調(diào)函數(shù),如下所示:
var fs =require('fs'); var data = fs.readFileSync('./test.txt'); console.log(data.toString());
3. 流式讀取
當(dāng)需要讀取的文件比較大時(shí),無法一次讀取完成,則需要采用流式讀取的方式,將數(shù)據(jù)從硬盤中一節(jié)一節(jié)的讀取。循環(huán)讀取一節(jié)就觸發(fā)回調(diào)函數(shù),以實(shí)現(xiàn)大文件操作。
假如現(xiàn)在有一個(gè)文件,采用流式讀取,如下所示:
var fs =require('fs'); //創(chuàng)建流 var stream=fs.createReadStream('./test.txt'); //監(jiān)控流獲取數(shù)據(jù)事件 stream.on('data',function(data){ console.log('--------------------------'); console.log(data.length); console.log(data); });
讀取示例如下所示:
通過以上示例可以看出,每一次字節(jié)流讀取的數(shù)據(jù)大小為65536字節(jié),即64KB。如果文件大小大于64KB,則會分為多節(jié)進(jìn)行讀取。
4. 寫入文件
寫入文件與讀取文件相對,如下所示:
var fs =require('fs'); var test="這周都沒有上班了,在居家辦公,好不方便呀?。?!"; fs.writeFile('./test1.txt',test,function(err){ if(err){ console.log(err); }else{ console.log('保存成功'); } });
示例如下:
文件默認(rèn)為utf-8編碼,如下所示:
同步寫入就是在異步寫入的方法后加入Sync即可。
5. 流式寫入文件
字節(jié)流的方式寫入文件,如下所示:
var fs =require('fs'); var stream = fs.createWriteStream('./input.txt'); stream.write("小六子瀟灑呀"); stream.write("小六公子瀟灑呀"); stream.write("小六痞子瀟灑呀"); stream.end();
寫入成功后,文件如下:
注意,流式寫入文件,一定要有end方法結(jié)束字節(jié)流。字節(jié)流還有其他事件,如:end,finish,error,都可以通過on進(jìn)行監(jiān)聽。
6. 讀取文件信息
Node.js不僅可以讀取寫入文件內(nèi)容,還可以讀取文件信息,如文件大小,創(chuàng)建時(shí)間等內(nèi)容,如下所示:
var fs =require('fs'); fs.stat('./test.txt',function(err,stat){ if(err){ console.log(err); }else{ console.log(stat); } });
讀取文件信息返回的是一個(gè)對象,包含文件的各個(gè)屬性,示例結(jié)果如下所示:
注意:返回的Stat對象,同時(shí)包含isFile和isDirectory方法,用于判斷路徑是否文件和文件夾。
7. 刪除文件
刪除文件可以采用unlink方法,如下所示:
var fs =require('fs'); fs.unlink('./test.txt',function(err){ if(err){ console.log(err); }else{ console.log('刪除成功'); } });
如果要?jiǎng)h除的文件不存在,則會返回錯(cuò)誤信息,如果存在,則提示刪除成功。示例結(jié)果如下所示:
8. 管道
管道(pipe)提供了一個(gè)輸出流到輸入流的機(jī)制。
通常我們復(fù)制大文件,采用從一個(gè)流中獲取數(shù)據(jù),并將數(shù)據(jù)傳遞到另外一個(gè)流中。如下所示:
var fs =require('fs'); var s1=fs.createReadStream('./test.txt'); var s2 = fs.createWriteStream('./input.txt'); //以流的方式實(shí)現(xiàn)大文件復(fù)制,讀取一節(jié),傳遞一節(jié) s1.on('data',function(data){ s2.write(data); }); s1.on('end',function(){ s2.end(); console.log('文件復(fù)制完成'); });
以上方式稍微有點(diǎn)復(fù)雜,采用管道方式,可以簡化操作,如下所示:
var fs =require('fs'); var s1=fs.createReadStream('./test.txt'); var s2 = fs.createWriteStream('./input.txt'); s1.pipe(s2);//管道方式
9. 鏈?zhǔn)搅?/h3>
將數(shù)據(jù)流通過管道鏈接起來,實(shí)現(xiàn)鏈?zhǔn)焦芾怼H鐗嚎s等方式。
var fs =require('fs'); var zlib =require('zlib'); var s1=fs.createReadStream('./test.txt'); var s2 = fs.createWriteStream('./test.zip'); s1.pipe(zlib.createGzip()).pipe(s2);
到此這篇關(guān)于Node.js基礎(chǔ)入門之緩存區(qū)與文件操作詳解的文章就介紹到這了,更多相關(guān)Node.js緩存區(qū) 文件操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js如何響應(yīng)Ajax的POST請求并且保存為JSON文件詳解
這篇文章主要介紹了關(guān)于Node.js是如何響應(yīng)Ajax的POST請求并且保存為JSON文件的相關(guān)資料,文中介紹的很詳細(xì),對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03詳解通過源碼解析Node.js中cluster模塊的主要功能實(shí)現(xiàn)
這篇文章主要介紹了詳解通過源碼解析Node.js中cluster模塊的主要功能實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Nestjs自定義注解實(shí)現(xiàn)接口權(quán)限控制詳解
這篇文章主要為大家介紹了Nestjs自定義注解實(shí)現(xiàn)接口權(quán)限控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Node.js中,在cmd界面,進(jìn)入退出Node.js運(yùn)行環(huán)境的方法
今天小編就為大家分享一篇Node.js中,在cmd界面,進(jìn)入退出Node.js運(yùn)行環(huán)境的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05node.js中module模塊的功能理解與用法實(shí)例分析
這篇文章主要介紹了node.js中module模塊的功能理解與用法,結(jié)合實(shí)例形式分析了node.js module模塊的基本功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02