Node.js重要模塊fs的學(xué)習(xí)總結(jié)

書(shū)上細(xì)節(jié)回顧

<p>之前在看《一本全面的Node.js教程》在書(shū)中最后的部分盗迟,作者實(shí)現(xiàn)了圖片上傳并在另外一個(gè)頁(yè)面中顯示的功能点楼。對(duì)圖片進(jìn)行保存是通過(guò)對(duì)請(qǐng)求的form表單進(jìn)行解析突倍,如下:

form.jpg

<p>這里使用了fs模塊的一個(gè)renameSync的方法钩杰,顧名思義谨设,這個(gè)方法首先是將目標(biāo)文件重命名低散,目標(biāo)文件的路徑由回調(diào)函數(shù)的參數(shù)傳入俯邓。這樣就可以將文件保存到自己定義的目錄下。但是這里rename后面還加了一個(gè)Sync熔号』蓿回想node.js之前接觸到的大量的異步知識(shí),于是思考fs模塊中應(yīng)該如何使用同步與異步引镊,以及其他基本的文件操作朦蕴。

fs模塊介紹

<p>打開(kāi)node.js的官方文檔篮条,對(duì)fs的介紹一目了然:fs模塊是文件操作的封裝,它提供了文件讀取梦重、寫(xiě)入兑燥、更名、刪除琴拧、遍歷目錄降瞳、鏈接等POSIX文件系統(tǒng)操作。與其它模塊不同的是蚓胸,fs模塊中所有的操作都提供了異步的和同步的兩個(gè)版本挣饥。
<p>其中,異步的方法的最后一個(gè)參數(shù)往往是完成以后的回調(diào)函數(shù)沛膳,而這個(gè)回調(diào)函數(shù)的第一個(gè)參數(shù)往往是err扔枫。如果操作成功完成,那么這個(gè)參數(shù)將會(huì)是null或者undefined锹安。當(dāng)對(duì)文件的操作是一系列有順序的操作時(shí)短荐,應(yīng)該使用回調(diào)嵌套√究蓿或者使用同步的版本忍宋。
<p>下面從最簡(jiǎn)單的讀寫(xiě)開(kāi)始介紹。

讀:

read.jpg

<p>fs.readFile 是讀取整個(gè)文件的異步方法风罩。注意:只要后面沒(méi)有加Sync糠排,默認(rèn)為異步。fs.readFile(filename,[encoding],[callback(error,data)]是最簡(jiǎn)單的文件讀取函數(shù)超升,它接受一個(gè)必選參數(shù)filename入宦,表示讀取的文件名,第二個(gè)參數(shù)encoding是可選的室琢,表示文件字符編碼乾闰。callback是回調(diào)函數(shù),用于接收文件的內(nèi)容研乒。如果不指定encoding汹忠,則callback就是第二個(gè)參數(shù)”荆回調(diào)函數(shù)提供兩個(gè)參數(shù)err和data宽菜,err表示有沒(méi)有錯(cuò)誤發(fā)生,data是文件內(nèi)容竿报。如果指定encoding铅乡,data是一個(gè)解析后的字符串,否則將會(huì)以Buffer形式表示的二進(jìn)制數(shù)據(jù)烈菌。

寫(xiě):

寫(xiě).jpg

<p>結(jié)果:

結(jié)果.jpg

<p>讀寫(xiě)成功阵幸。接下來(lái)介紹append:

append函數(shù).jpg

<p>其實(shí)writeFile也可以實(shí)現(xiàn)append的功能花履,只要置flag為a即可。這里總結(jié)一下flag的值的含義:

  • r:以讀取模式打開(kāi)文件
  • r+:以讀寫(xiě)模式
  • w:以寫(xiě)入模式打開(kāi)挚赊,如果不存在則創(chuàng)建
  • w+:以讀寫(xiě)模式打開(kāi)诡壁,如果不存在則創(chuàng)建
  • a:以追加模式打開(kāi)文件,如果不存在則創(chuàng)建
  • a+:以讀取追加模式打開(kāi)文件荠割,如果文件不存在則創(chuàng)建妹卿。

<p>結(jié)果:


append.jpg

<p>至此,fs最常用的文件讀寫(xiě)方法已經(jīng)介紹完畢蔑鹦。

其他fs模塊的方法:

fs.open:

<p>fs.opne(path,flags,[mode],[callback(err,fd)])是POSIX open函數(shù)的封裝夺克,與c語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的fopen函數(shù)類似。它接受兩個(gè)必選參數(shù)嚎朽,path為文件的路徑铺纽。fd是讀取文件的文件描述符。

fs.read:

<p>fs.read(fd,buffer,offset,length,position,[callback(err,bytesRead,buffer)])是POSIX read函數(shù)的封裝哟忍,相比f(wàn)s.readFile提供了更底層的接口狡门。fs.read的功能是從指定的文件描述符fd中讀取數(shù)據(jù)并寫(xiě)入buffer指向的緩沖區(qū)對(duì)象。offset是buffer的寫(xiě)入偏移量锅很。length是要從文件中讀取的字節(jié)數(shù)融撞。position是文件讀取的起始位置,如果position的值為null粗蔚,則會(huì)從當(dāng)前文件指針的位置讀取,回調(diào)函數(shù)傳遞bytesRead和buffer饶火,分別表示讀取的字節(jié)數(shù)和緩沖區(qū)對(duì)象鹏控。

  • fs.mkdir fs.mkdir(path,[mode],callback),創(chuàng)建目錄。
  • fs.readdir fs.readdir(path,callback),讀取目錄肤寝,callback(err, files)当辐,files數(shù)組傳回的是讀取的目錄下所有文件的文件名稱。
  • fs.rename fs.rename(oldPath, newPath, callback),重命名(移動(dòng))文件鲤看。
  • fs.exists fs.exists(path,callback),查看文件與目錄是否存在
  • fs.stat fs.stat(path, callback)查看文件信息缘揪。

同步異步比較:

<p>首先編寫(xiě)同步讀取兩個(gè)較大的文件的程序:


同步讀取程序.jpg

結(jié)果:


同步讀取結(jié)果.jpg

很明顯,是同步完成的义桂。
再來(lái)看看異步的程序:
異步讀取程序.jpg

異步讀取的結(jié)果:

異步結(jié)果.jpg

<p>奇怪的事情發(fā)生了找筝,程序先執(zhí)行完了,耗時(shí)36毫秒慷吊。第二個(gè)文件較小袖裕,先讀完,僅花了145毫秒溉瓶,第一個(gè)文件較大急鳄,讀完一共花了345毫秒谤民。但是總體上比同步讀取速度快。

注意

<p>異步IO操作在進(jìn)行大量的IO操作時(shí)可以有效節(jié)省系統(tǒng)時(shí)間疾宏,但是需要注意操作順序的問(wèn)題张足。下面看一個(gè)例子,在例子中坎藐,我們想先修改文件名稱为牍,再讀取文件。同步:

同步成功程序.jpg

結(jié)果:

成功結(jié)果.jpg

如果異步程序不加任何限制顺饮,會(huì)出錯(cuò):

序列操作異步.jpg

結(jié)果:

失敗結(jié)果.jpg

因此在進(jìn)行有順序的一系列操作的時(shí)候應(yīng)該采用異步回調(diào)嵌套如下吵聪,或者干脆采用同步的方法。這也是同步方法的優(yōu)點(diǎn)和存在的意義兼雄。

異步成功程序.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吟逝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赦肋,更是在濱河造成了極大的恐慌块攒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佃乘,死亡現(xiàn)場(chǎng)離奇詭異囱井,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趣避,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門庞呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人程帕,你說(shuō)我怎么就攤上這事住练。” “怎么了愁拭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵讲逛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岭埠,道長(zhǎng)盏混,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任惜论,我火速辦了婚禮许赃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘来涨。我一直安慰自己图焰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布蹦掐。 她就那樣靜靜地躺著技羔,像睡著了一般僵闯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藤滥,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天鳖粟,我揣著相機(jī)與錄音,去河邊找鬼拙绊。 笑死向图,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的标沪。 我是一名探鬼主播榄攀,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼金句!你這毒婦竟也來(lái)了檩赢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤违寞,失蹤者是張志新(化名)和其女友劉穎贞瞒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趁曼,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡军浆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挡闰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乒融。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摄悯,靈堂內(nèi)的尸體忽然破棺而出簇抵,到底是詐尸還是另有隱情,我是刑警寧澤射众,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站晃财,受9級(jí)特大地震影響叨橱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜断盛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一罗洗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钢猛,春花似錦伙菜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)火的。三九已至,卻和暖如春淑倾,著一層夾襖步出監(jiān)牢的瞬間馏鹤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工娇哆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湃累,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓碍讨,卻偏偏與公主長(zhǎng)得像治力,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勃黍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 實(shí)驗(yàn)簡(jiǎn)介 fs模塊用于對(duì)系統(tǒng)文件及目錄進(jìn)行讀寫(xiě)操作參考鏈接:http://nodejs.org/api/fs.ht...
    張金宇閱讀 607評(píng)論 0 0
  • fs模塊即Node.js的文件系統(tǒng)模塊宵统,是Node.js的核心模塊之一,它提供了一個(gè)API溉躲,以模仿標(biāo)準(zhǔn) POSIX...
    偶余杭閱讀 784評(píng)論 0 0
  • fs模塊是文件操作的封裝榜田。fs模塊中所有的操作都提供了異步和同步兩個(gè)版本。 fs.readFilefs.readF...
    小坤老師閱讀 399評(píng)論 0 0
  • Node.js內(nèi)置的fs模塊就是文件系統(tǒng)模塊锻梳,負(fù)責(zé)讀寫(xiě)文件箭券,提供了異步和同步的方法。 異步讀文件 sample.t...
    子木同閱讀 500評(píng)論 0 1
  • 內(nèi)容來(lái)自《Node.js開(kāi)發(fā)指南》 核心模塊是 Node.js 的心臟疑枯,它由一些精簡(jiǎn)而高效的庫(kù)組成辩块,為 Node....
    angelwgh閱讀 898評(píng)論 0 1