【nodejs】緩沖與文件系統(tǒng)

緩沖區(qū)

  • 當瀏覽器向服務器請求數(shù)據(jù)后掘譬,數(shù)據(jù)先被加載到buffer中,再被瀏覽器讀扰澜ⅰ们陆;瀏覽器向服務器上傳數(shù)據(jù)寒瓦,也是先加載到buffer中情屹,再給服務器。buffer是一個用于過度的中間地帶

  • buffer的結(jié)構(gòu)和數(shù)組很像杂腰,操作的方法也和數(shù)組類似

  • 數(shù)組不能存儲二進制文件垃你,buffer專門用于存儲二進制數(shù)據(jù)

  • 使用buffer不需要引入模塊

    var str = "哈庫那馬塔塔"
    
    //將str保存到buffer中
    var buf = Buffer.from(str)
    console.log(buf) //此處會打印出str的二進制格式,但是是以十六進制去顯示
    console.log(buf.toString()) //調(diào)用toString方法喂很,轉(zhuǎn)化為字符串
    
  • 可以創(chuàng)建一個指定大小的buffer

    var buf2 = new Buffer(1024) //指定大小為1024byte惜颇,即1kb,但是最好別用這個方法
    
    var buf = Buffer.alloc(1024) //直接使用這種方法創(chuàng)建1kb的buffer
    
  • 可以通過索引少辣,去操作buffer中的元素

    buf2[0] = 0
    buf2[1] = 255
    
  • buffer的大小一旦確定凌摄,便不能修改,因為buffer操作實際上是對底層的內(nèi)存的直接操作

文件系統(tǒng)(fs)

  • node中用于操作系統(tǒng)中文件的模塊漓帅。在node中锨亏,與文件系統(tǒng)的交互是非常重要的,服務器的本質(zhì)就是將本地的文件發(fā)送給遠程的客戶端

  • fs模塊提供了打開忙干、讀取器予、寫入文件,以及與文件交互等API

  • 使用fs模塊需要對其先進行加載捐迫,直接引入乾翔,不需要下載

    const fs = require("fs")
    
  • fs模塊中所有的操作都可以選擇是同步的還是異步的

    • 同步文件系統(tǒng)有可能會阻塞程序的正常執(zhí)行,因為除非操作完畢施戴,否則代碼就會卡在那里
    • 異步文件系統(tǒng)不會阻塞成語的執(zhí)行反浓,在操作完成后,通過回調(diào)函數(shù)將結(jié)果返回

文件寫入

文件的寫入一般分為三步:

1. 打開文件
2. 向文件中寫入內(nèi)容
3. 保存赞哗,關閉文件

同步的文件寫入

  1. 打開文件

    var fd = fs.openSync(path, flags[, mode])
    
    • path:要打開的文件路徑
    • flags:打開文件要做的操作的類型雷则,和C語言類似
    • 此方法會返回一個文件的描述符作為結(jié)果,可以通過該描述符對文件進行操作
  2. 寫入內(nèi)容

    fs.writeSync(fd, string[, position[, encoding]])
    
    • fd:需要寫入的文件的描述符
    • string:要寫入的內(nèi)容
  3. 關閉文件

    fs.closeSync(fd)
    

異步的文件寫入

  1. 打開文件

    fs.open(path, flags[, mode], callback)
    
    • callback:回調(diào)函數(shù)

    • 異步的open返回值為undefined懈玻,異步的結(jié)果都是通過回調(diào)函數(shù)的參數(shù)進行返回的

      fs.open("hello.txt", "r", function(err, fd){
         if(!err){
             console.log(fd)
         }else{
             console.log(err)
         }
      })
      
      • 回調(diào)函數(shù)有兩個參數(shù)
        • err:錯誤對象巧婶,如果沒有錯誤則為null
        • 描述符
  2. 寫入內(nèi)容

    fs.write(fd, string[, position[, encoding]], callback)
    
    • 異步寫入的寫入操作不能在全局執(zhí)行乾颁,因為讀取文件已經(jīng)是異步的了。要寫在打開文件成功的循環(huán)內(nèi)

      fs.open("hello.txt", "r", function(err, fd){
         if(!err){ //沒有出錯艺栈,進行寫入
             fs.write(fd, "異步寫入", function(err){
                 if(!err){
                     console.log("寫入成功")
                 }
             })
         }else{
             console.log(err)
         }
      })
      
  3. 關閉文件英岭,異步的關閉也要在循環(huán)內(nèi)寫,不能寫在全局

    fs.open("hello.txt", "r", function(err, fd){
     if(!err){ //沒有出錯湿右,進行寫入
         fs.write(fd, "異步寫入", function(err){
             if(!err){
                 console.log("寫入成功")
             }
             //關閉文件
             fs.close(fd, function(err){
                 if(!err){
                     console.log("關閉成功")
                 }
             })
         })
     }else{
         console.log(err)
     }
    })
    

簡單文件寫入

實際開發(fā)中诅妹,純粹的同步寫入和西部寫入要么寫起來很麻煩,要么可能會出現(xiàn)程序阻塞毅人。下面是簡單寫入方法吭狡,也分成同步和異步,是node提供的一個語法糖

  • 異步的簡單文件寫入

    fs.writeFile(file, data[, options], callback)
    
    • file:要操作的文件路徑
    • data:要寫入的數(shù)據(jù)
    var fs = require("fs")
    fs.writeFile("hello.txt", "簡單文件寫入的內(nèi)容", function(err){
      if(!err){
          console.log("簡單寫入成功")
      }
    }) n
    
  • 同步的簡單文件寫入

    fs.writeFileSync(file, data[, options])
    

流式文件寫入

  • 上面提到的文件寫入的方式丈莺,都是一次性的將要寫入的內(nèi)容直接保存到文件中划煮,意味著當進行寫入之前,要將所有要寫入的內(nèi)容準備好缔俄,那么如果文件太大的話弛秋,將會非常的占用內(nèi)存

  • 流式文件寫入就是一種給大文件寫入的解決方案,是一種持續(xù)寫入的方案

  1. 創(chuàng)建可寫流

    fs.createWriteStream(path[, options])
    
    var ws = fs.createWriteStream("hello.txt")
    
  2. 通過可寫流寫入文件

    ws.write("通過可寫流進行寫入")
    
    • 可以通過監(jiān)聽流的open和close事件來監(jiān)聽流是否被打開

      ws.once("open", function(){
         console.log("流打開了")
      })
      
  3. 關閉流

    ws.end()
    

簡單文件讀取

也分成異步和同步

  • 異步的

    fs.readFile("htllo.txt", function(err, data){
      if(!err){
          console.log(data.toString())
      }else{
          ...
      }
    })
    

流式文件讀取

適用于大文件的讀取俐载,可以分多次將文件讀取到內(nèi)存中

  1. 創(chuàng)建可讀流

    var rs = fs.createReadStream("hello.txt")
    
  2. 監(jiān)聽流

    rs.once("open", function(){
     console.log("可讀流打開")
    })
    rs.once("close", function(){
     console.log("可讀流關閉")
    })
    
  3. 讀取可讀流的數(shù)據(jù)蟹略,要為可讀流綁定一個data事件。當data綁定完畢遏佣,會自動開始讀取數(shù)據(jù)挖炬,數(shù)據(jù)通過data返回

    rs.on("data", function(data){
     console.log(data)
    })
    

pipe()方法

可以直接將可讀流中的內(nèi)容直接輸出到可寫流

var rs = fs.createReadStream("hello.txt")
var ws = fs.createWriteStream("aaaa.txt")
rs.pipe(ws)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市状婶,隨后出現(xiàn)的幾起案子意敛,更是在濱河造成了極大的恐慌,老刑警劉巖太抓,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件空闲,死亡現(xiàn)場離奇詭異,居然都是意外死亡走敌,警方通過查閱死者的電腦和手機碴倾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掉丽,“玉大人跌榔,你說我怎么就攤上這事〈氛希” “怎么了僧须?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長项炼。 經(jīng)常有香客問我担平,道長示绊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任暂论,我火速辦了婚禮面褐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘取胎。我一直安慰自己展哭,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布闻蛀。 她就那樣靜靜地躺著匪傍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪觉痛。 梳的紋絲不亂的頭發(fā)上役衡,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音秧饮,去河邊找鬼映挂。 笑死,一個胖子當著我的面吹牛盗尸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帽撑,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泼各,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亏拉?” 一聲冷哼從身側(cè)響起扣蜻,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎及塘,沒想到半個月后莽使,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡笙僚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年芳肌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肋层。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿笤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栋猖,到底是詐尸還是另有隱情净薛,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布蒲拉,位于F島的核電站肃拜,受9級特大地震影響痴腌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燃领,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一衷掷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柿菩,春花似錦戚嗅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凉泄,卻和暖如春躏尉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背后众。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工胀糜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畏铆,地道東北人飘诗。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像谜叹,于是被迫代替她去往敵國和親右锨。 傳聞我的和親對象是個殘疾皇子括堤,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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