nodejs+mongodb筆記------第二章(Buffer緩沖器、node中的文件操作)

1.Buffer緩沖器

1.Buffer是什么?

  • 1.它是一個類似于數(shù)組的對象,用于存儲數(shù)據(jù)(存儲的是二進(jìn)制數(shù)據(jù))。
  • 2.Buffer的效率很高,存儲和讀取很快,直接對計(jì)算機(jī)的內(nèi)存進(jìn)行操作。
  • 3.Buffer的大小一旦確定了,不可修改。
  • 4.每個元素占用內(nèi)存的大小為1字節(jié)。
  • 5.Buffer是Node中的非常核心的模塊,無需下載、無需引入即可使用

2.進(jìn)制:

  • 十六進(jìn)制:00 ----- ff
  • 十進(jìn)制: 00 ----- 255
  • 二進(jìn)制: 00000000 ------- 11111111

3.換算

  • 8 bit(位) = 1 byte(字節(jié))
  • 1024byte = 1KB
  • 1024Kb = 1MB
  • 1024Mb = 1Gb
  • 1024GB = 1TB
  • 1024TB = 1PB
//1.將一個字符串存入Buffer中
let str = 'HELLO WORLD'
let buf = Buffer.from(str)
console.log(buf) //<Buffer 48 45 4c 4c 4f>

//2.alloc這種方式去創(chuàng)建Buffer實(shí)例---效率一般
let buf2 = Buffer.alloc(10)
console.log(buf2) //<Buffer 00 00 00 00 00 00 00 00 00 00> 00占位代表(空內(nèi)存)

//3.allocUnsafe這種方式去創(chuàng)建Buffer實(shí)例---效率很好,但是存在一些安全問題
let buf3 = Buffer.allocUnsafe(10) 
console.log(buf3) //<Buffer 0e 00 00 00 06 02 00 00 06 00> 使用沒有被引用的內(nèi)存,可能殘留一些信息

//4.使用new關(guān)鍵字創(chuàng)建一個Buffer實(shí)例(即將被棄用)-----效率很低
let buf4 = new Buffer(10)
console.log(buf4) // <Buffer 00 00 00 00 00 00 00 00 00 00>

2.Node中的文件操作(寫入)

Node中的文件系統(tǒng):

  • 在NodeJs中有一個文件系統(tǒng),所謂的文件系統(tǒng),就是對計(jì)算機(jī)中的文件進(jìn)行增刪改查等操作。
  • 在NodeJs中,給我們提供了一個模塊,叫做fs模塊,專門用戶操作文件。
  • fs模塊是Node的核心模塊,使用的時候,要引入進(jìn)來,不用下載安裝。

簡單文件寫入(異步):

fs.writeFile(file, data[, options], callback)
        --file:文件路徑+文件名
        --data:要寫入的數(shù)據(jù)
        --options:配置選項(xiàng)(可選參數(shù))
              --flag:打開文件要進(jìn)行的操作,默認(rèn)是w
                    'w':直接寫入
                    'a':追加
              --mode:文件權(quán)限的限制,默認(rèn)值是0o666
                    --0o111:文件可被執(zhí)行
                    --0o222:文件可被寫入
                    --0o444:文件可被讀取
              --encoding:默認(rèn)值utf8
        --callback:回調(diào)函數(shù)
              --err

備注:在Node中有一個設(shè)計(jì)原則:錯誤優(yōu)先。
不足之處:簡單文件寫入是一次性把所有要寫入的數(shù)據(jù)加載到內(nèi)存中,對于比較大的文件容易產(chǎn)生內(nèi)存溢出,適用于較小的文件寫入。

//1.引入fs模塊
let fs = require('fs')

//2.進(jìn)行簡單文件寫入
fs.writeFile('./720.txt','哈哈',{
  flag:'w',
  mode:0o666,
  encoding:'utf8'
},(err)=>{
    if(!err){
      console.log('文件寫入成功了!')
    }else{
      console.log(err)
  }
})

流式文件寫入:

fs.createWriteStream(path[, options])
    --path:文件路徑+文件名
    --options:配置對象(可選)
        --flags:打開文件要進(jìn)行的操作,默認(rèn)是w
                    'w':直接寫入
                    'a':追加
        --mode:文件權(quán)限的限制,默認(rèn)值是0o666
                    --0o111:文件可被執(zhí)行
                    --0o222:文件可被寫入
                    --0o444:文件可被讀取
          --encoding:默認(rèn)值utf8
          --fd:文件的唯一標(biāo)識。(了解)
          --autoClose:自動關(guān)閉,當(dāng)數(shù)據(jù)操作完畢,自動關(guān)閉文件,默認(rèn)是true
          --start:文件寫入的起始位置
//1.引入fs模塊
let fs = require('fs')

//2.創(chuàng)建一個可寫流
let ws = fs.createWriteStream('./demo.txt',{
  start:20
})

//只要使用了流,必須給流加監(jiān)聽
ws.on('open',()=>{
   console.log('可寫流打開了')
})
ws.on('close',()=>{
  console.log('可寫流關(guān)閉了')
})

//3.開始寫入數(shù)據(jù)
ws.write('馬上晚上放學(xué)了\n')
ws.write('我餓了\n')
ws.write('餓了你就忍著吧\n')
ws.close() //如果用的是Node的8版本一下(包含8版本),用此種方式關(guān)閉流,容易造成數(shù)據(jù)丟失。
//ws.end()

3.Node中的文件操作(讀取)

簡單文件讀取:

fs.readFile(path[, options], callback)
    --path:文件路徑+文件名
    --options:配置對象
        --encoding:文件編碼
        --flag:打開文件要進(jìn)行的操作
    --callback:回調(diào)函數(shù)
        --err:錯誤對象
        --data:數(shù)據(jù)
//1.引入fs模塊
let fs = require('fs')

//2.簡單文件讀取
fs.readFile('./music.mp3',(err,data)=>{
    if(!err){
      //思考?為什么讀取出來的是Buffer類型(看不懂),因?yàn)樽x取出來的數(shù)據(jù)不一定是文本,可能是媒體文件。
      //console.log(data.toString())
      fs.writeFile('../demo.mp3',data,(err)=>{
          if(!err){
            console.log('ok')
          }else{
            console.log(err)
          }
      })
    }else{
      console.log(err)
    }
})

流式文件讀?。?/h4>
fs.createReadStream(path[, options])
  --path:文件路徑+文件名
  --options:配置對象(可選)
      --flags:打開文件要進(jìn)行的操作,默認(rèn)是w
                  'w':直接寫入
                  'a':追加
      --mode:文件權(quán)限的限制,默認(rèn)值是0o666
                  --0o111:文件可被執(zhí)行
                  --0o222:文件可被寫入
                  --0o444:文件可被讀取
      --encoding:默認(rèn)值utf8
      --start:讀取的起始點(diǎn)
      --end:讀取的結(jié)束點(diǎn)
      --highWaterMark:每次讀取數(shù)據(jù)的大小 默認(rèn)值是:64 * 1024
//1.引入fs模塊
let fs = require('fs')

//2.創(chuàng)建一個可讀流,對于可讀流來說,當(dāng)沒有數(shù)據(jù)可繼續(xù)讀取的時候,會自動關(guān)閉可讀流。
let rs = fs.createReadStream('./music.mp3',{
  //start:2000,
  //end:90000,
  highWaterMark:1024 * 1024
})
let ws = fs.createWriteStream('../demo.mp3')

//使用了流,必須給流加監(jiān)聽(為了確保每個流都能夠在使用完畢后關(guān)閉)
rs.on('open',()=>{
  console.log('可讀流打開了')
})
rs.on('close',()=>{
  console.log('可讀流關(guān)閉了')
  ws.close()
})
ws.on('open',()=>{
  console.log('可寫流打開了')
})
ws.on('close',()=>{
  console.log('可寫流關(guān)閉了')
})

//3.給可讀流綁定一個data事件,會自動觸發(fā)流讀取文件
rs.on('data',(data)=>{
    //輸出Buffer實(shí)例的length的時候,輸出的不是長度,輸出的是占用內(nèi)存的大小
    //console.log(data.length)
    ws.write(data)
})

關(guān)于環(huán)境變量的說明

什么是環(huán)境變量?

    1. 定義:是系統(tǒng)執(zhí)行命令時候會讀取的變量
    1. 分為兩種:系統(tǒng)環(huán)境變量、用戶環(huán)境變量
    1. 配置方法:我的電腦 -> 高級系統(tǒng)設(shè)置 -> 環(huán)境變量 ->用戶環(huán)境變量
    1. 配置原則:優(yōu)先修改用戶環(huán)境變量,如不能完成目的,再修改系統(tǒng)環(huán)境變量。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容