Node.js基礎(chǔ)入門之緩存區(qū)與文件操作詳解
經(jīng)過前面三天的學(xué)習(xí),Node.js的基礎(chǔ)知識已逐漸掌握,今天繼續(xù)學(xué)習(xí)緩存區(qū)和文件操作,并稍加整理加以分享,如有不足之處,還請指正。
緩存區(qū)
1. 什么是緩存區(qū)?
JavaScript語言自身只有基本數(shù)據(jù)類型(如:字符串),沒有二進制數(shù)據(jù)類型。二進制數(shù)據(jù)可以存儲電腦中任何數(shù)據(jù)(如:一段文本,一張圖片等)。Node.js作為服務(wù)端,在處理TCP網(wǎng)絡(luò)流或文件流時,必須使用到二進制數(shù)據(jù)。因此在Node.js中定義了一個Buffer類,用來創(chuàng)建一個專門存放二進制數(shù)據(jù)的緩存區(qū)。所以緩存區(qū)就是在內(nèi)存中開辟一個臨時用于存儲需要運算的字節(jié)碼的區(qū)域。
2. 創(chuàng)建指定長度的緩存區(qū)
在Node.js中提供了一個Buffer對象,可以直接創(chuàng)建指定長度的緩存區(qū),如下所示:
var buffer = Buffer.alloc(10);; buffer.write('abcdefghij'); console.log(buf);
示例輸出結(jié)果,如下所示:
通過以上示例可以看出,寫入的一串英文字符,在緩存區(qū)中是以十六進制格式顯示的。
關(guā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個字符 [1] 。示例如下所示:
在緩存區(qū)存儲漢字的時候,也會轉(zhuǎn)換成UTF-8編碼的字節(jié)碼,并以十六進制表示,如下所示:
var buffer = Buffer.alloc(10); buffer.write('張三'); console.log(buffer);
示例如下所示:
通過以上示例,可以看出,在Node.js中,采用UTF-8編碼,1個英文字符占1個字節(jié);1個中文漢字3-4個字節(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ù)組的格式是十進制整數(shù),存儲到緩存區(qū)時,轉(zhuǎ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)容從一個緩存區(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. 同步直接讀取
同步方式直接返回數(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ù)據(jù)從硬盤中一節(jié)一節(jié)的讀取。循環(huán)讀取一節(jié)就觸發(fā)回調(diào)函數(shù),以實現(xiàn)大文件操作。
假如現(xiàn)在有一個文件,采用流式讀取,如下所示:
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é)進行讀取。
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進行監(jiān)聽。
6. 讀取文件信息
Node.js不僅可以讀取寫入文件內(nèi)容,還可以讀取文件信息,如文件大小,創(chuàng)建時間等內(nèi)容,如下所示:
var fs =require('fs'); fs.stat('./test.txt',function(err,stat){ if(err){ console.log(err); }else{ console.log(stat); } });
讀取文件信息返回的是一個對象,包含文件的各個屬性,示例結(jié)果如下所示:
注意:返回的Stat對象,同時包含isFile和isDirectory方法,用于判斷路徑是否文件和文件夾。
7. 刪除文件
刪除文件可以采用unlink方法,如下所示:
var fs =require('fs'); fs.unlink('./test.txt',function(err){ if(err){ console.log(err); }else{ console.log('刪除成功'); } });
如果要刪除的文件不存在,則會返回錯誤信息,如果存在,則提示刪除成功。示例結(jié)果如下所示:
8. 管道
管道(pipe)提供了一個輸出流到輸入流的機制。
通常我們復(fù)制大文件,采用從一個流中獲取數(shù)據(jù),并將數(shù)據(jù)傳遞到另外一個流中。如下所示:
var fs =require('fs'); var s1=fs.createReadStream('./test.txt'); var s2 = fs.createWriteStream('./input.txt'); //以流的方式實現(xiàn)大文件復(fù)制,讀取一節(jié),傳遞一節(jié) s1.on('data',function(data){ s2.write(data); }); s1.on('end',function(){ s2.end(); console.log('文件復(fù)制完成'); });
以上方式稍微有點復(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ù)流通過管道鏈接起來,實現(xiàn)鏈?zhǔn)焦芾?。如壓縮等方式。
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)資料,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03詳解通過源碼解析Node.js中cluster模塊的主要功能實現(xiàn)
這篇文章主要介紹了詳解通過源碼解析Node.js中cluster模塊的主要功能實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Nestjs自定義注解實現(xiàn)接口權(quán)限控制詳解
這篇文章主要為大家介紹了Nestjs自定義注解實現(xiàn)接口權(quán)限控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Node.js中,在cmd界面,進入退出Node.js運行環(huán)境的方法
今天小編就為大家分享一篇Node.js中,在cmd界面,進入退出Node.js運行環(huán)境的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05