NODE(buffer、fs、path)

NODE(buffer、fs、path)

Node

  • 特點:
    • 可以讓js跑在瀏覽器之外
    • 可以操作讀寫
  • 同步異步
    • 同步:代碼依次執行
    • 異步:同步代碼執行後再執行(定時器,callback)–》效率高
  • 學習要求:
    • 自己寫接口,前後端分離,寫網站(ejs jade)
  • 阻塞和非阻塞
    • 請求–》內核業務處理–》毀掉後針對請求處理

Buffer

  • 1.定義及特點
    • (1)定義:緩存區,操作的是二進制的數據,表現出來的是16進制
    • (2)特點
      • a.可以和字符串進行轉換
      • b.buffer中存的是內存空間(像二維數組)
  • 2.字節
    • 八個二進制數組成一個字節
    • 1b=8bit(8個二進制) 一字節=8比特
    • 換算公式:當前位的最大值*進制^(所在位-1) 累加的和
    • 一個字,三個字節
  • 3.固定大小buffer創建方式

    var buffer=new Buffer();
    • (1)通過長度創建buffer

      var buffer1=new Buffer(100);//隨機創建100個大的16進制
      buffer1.fill(0);//將每個16進制上填成0
    • (2)放置字符串

      var buffer=new Buffer('珠峯');
      console.log(buffer.length);//buffer的長度
    • (3)放數組

      • 數組中的值>255 對256取模,餘數是當前值
      • 數組中的值<0 在原來基礎上+256
      • 數組中的值無法識別–》0
      var buffer=new Buffer([100,101,102]);
      console.log(buffer);
      /*原始數組
      var a=[1,2];
      var arr=[a,1,2];
      var newArr=arr.slice(0);
      a[0]=100;
      console.log(newArr);//數組中存的是地址*/
  • 4.buffer操作

    • (1)slice
    var buffer=new Buffer([1,2,3]);
    var newBuffer=buffer.slice(0,1);
    • (2)write

      • 參數1 : string 要寫入的內容
      • 參數2 : 偏移量
      • 參數3 : 寫入的長度
      • 參數4 :編碼格式
        –》參數沒寫時 默認是0
      var buffer=new Buffer(12);
      buffer.write('珠峯');
      buffer.write('培訓',6);
      console.log(buffer.toString());//珠峯培訓
    • (3)copy
      • 參數1:targetbuffer 目標buffer
      • 參數2:sourceStart目標源開始
      • 參數3 : targetstart 目標開始
      • 參數4: sourceEnd目標源結束
        -》參數2,3,4用數字表示(字的字節數)
    var buffer=new Buffer(12);
    var buffer1=new Buffer('珠峯');
    var buffer2=new Buffer('培訓');
    buffer1.copy(buffer);
    buffer2.copy(buffer,6);
    console.log(buffer.toString());
    • (4)fill
    buffer1.fill(0);//將每個16進制上填成0
    • (5)concat
      • 參數1:傳入的buffer數組
      • 參數2:傳入數據總長度(可有可無)
    concat詳解
    /**
    *
    * @param list 傳入一個buffer數組
    * @param totalLength  總長度,可傳可不傳
    */
    Buffer.myConcat=function (list, totalLength) {
    //1.沒傳,算出長度,構建buffer,將數組中的buffer拷貝
    if(typeof totalLength=='undefined'){
        totalLength=0;
        list.forEach(function (item) {
            totalLength+=item.length;
        });
        Buffer.concat([buffer1,buffer2],totalLength).toString()
    }
    //2.傳了totalLength,構建了buffer,將buffer1,buffer2拷貝上去
    var buffer=new Buffer(totalLength);
    var index=0;
    list.forEach(function (item) {
        item.copy(buffer,index);
        index+=item.length;//計算當前拷貝的總長度
    });
    //3.slice截取到多餘長度
    return buffer.slice(0,index);
    };
    console.log(Buffer.concat([buffer1,buffer2]).toString());//buffer 放在數組中

進制轉換

fs(file system)

  • 1.讀取文件

    • 特點
      • 只能讀取已經存在的內容
      • 默認是buffer類型
      • 將內容讀取到內容中,readFile不能讀取比內存大的文件
    • 類型

      • 同步
        • 可以使用try catch
        • 結果放到回調函數中
      • 異步【readFile 】
        • 解決方式–》回調函數
          • 參數1:error-first:將回調函數的第一個參數作爲錯誤參數
          • 參數2:參數2:編碼格式
          • 參數3:回調函數
        • 可以看到文件內容
      • 讀取方式1:

        var school={};
        fs.readFile('./name.txt','utf8',function (err,data) {
        school.name=data;
        fs.readFile('./age.txt','utf8',function (err, data) {
        school.age=data;
        console.log(school)
        });
        });
      • 讀取方式2:並行讀取

        fs.readFile('./name.txt','utf8',function (err,data) {
        school.name=data;
        out();
        });
        fs.readFile('./age.txt','utf8',function (err, data) {
        school.age=data;
        out();
        });
        function out() {
        //Object.keys(school)將對象的屬性轉換成數組
        if(Object.keys(school).length==2){
        console.log(school);
        }
        }
  • 2.寫文件 【writeFileSync / writeFile】
const fs=require('fs');
fs.writeFileSync('./name.txt',new Buffer('珠峯'));
//異步
fs.writeFile('./name.txt','hello',function (err) {
    console.log(err)
});
  • 3.拷貝文件copy

    • 同步拷貝
    var fs=require('fs');
    function copySync(source,target) {
    //readFileSync +writeFileSync
    var result=fs.readFileSync(source,'utf8');
    fs.writeFileSync(target,result)
    }
    copySync('./name.txt','./n.txt');
    • 異步拷貝
    function copy(source,target) {
    //readFile+writeFile
    fs.readFile(source,'utf8',function (err, data) {
       if(err){
           console.log(err)
       }else{
           fs.writeFile(target,data,function (err) {
              if(err){console.log(err)}
           });
       }
    })
    }
    copy('./name.txt','.n/txt');
    • 執行次數的追加 【flag/appendFileSync】
    (1)flag
    fs.writeFileSync('./name.txt','hello',{flag:'a'});
    (2)appendFileSync=》讓flag默認爲a
    fs.appendFileSync('./name.txt','hello');
  • 4.文件夾的操作

    • 創建
      • 有父親才能創建兒子
      • fs.mkdirSync(‘parent’)

      • fs.readFile

      • writeFileSync
      • writeFile
    • 是否存在
      • fs.existsSync(‘parent’);
    • 追加
      • appendFileSync
    • 刪除目錄
      • fs.rmdirSync(‘parent’);
    • 刪除文件
      • unlink
      • unlinkSync
    • 循環創建實例
    1) 同步:
    function makep(path) {
    var arr=path.split('/');
    arr.forEach(function (item, index) {
        let temp=arr.slice(0,index+1).join('/');
        //刪除前判斷文件夾是否存在
        var flag=fs.existsSync(temp);
        if(!flag){
            fs.mkdirSync(temp)
        }
    })
    }
    makep('parent/child/child');

    path

  • 核心模塊-》自帶的
var path=require('path');
//以當前目錄的文件名生成一個絕對路徑
  • 操作

    • join
    console.log(path.join(__dirname,'1.js'));
    //D:\學習培訓\NODE C模塊\node2\8.path\1.js
    console.log(path.join(__dirname,'..','1.js'));//上一級
    //
    D:\學習培訓\NODE C模塊\node2\1.js
    • resolve**
    console.log(path.resolve('../1.js'));
    // D:\學習培訓\NODE C模塊\node2\1.js
    • herits
    • extname
    console.log(path.extname('a.min.js'));
    //.js
    • sep 分隔符
    console.log(path.sep);
    //   \

    event****

    function Man() {
    this._events={};
    }
    Man.prototype.on=function (eventName, callback) {
    
    if(this._events[eventName]){
        this._events[eventName].push(callback);//第二次找到
    }else{
        this._events[eventName]=[callback];
    }
    };
    Man.prototype.emit=function (eventName,...args) {//將剩餘參數轉數組
    // [].slice.call(arguments,1);
    // Array.from(arguments);//直接把arguments轉化成數組  類數組轉數組
    if(this._events[eventName]){
        this._events[eventName].forEach((item) =>{//  箭頭函數不存在this指向,內部this指向外部this
            item.apply(this,args);//將參數一個個傳進去
        })
    }
    };
    Man.prototype.removeListener=function (eventName, callback) {
    if(this._events[eventName]){
        this._events[eventName]= this._events[eventName].filter(function (item) {
            //true 留下 false 刪除,返回一個新數組
            return item!=callback&&item.g!=callback;//有一個爲false就刪除
        })
    }
    };
    Man.prototype.once=function (eventName,callback) {
    //callback 觸發後移除
    function one() {//最終觸發one方法  將one中的參數傳給callback
        callback.apply(this,arguments);
        this.removeListener(eventName,one);
    }
    one.g=callback;//{'有錢了':[one.g=callback]}
    this.on(eventName,one);
    //在one方法上體現代表的是哪個one
    };
    var man=new Man();
    function buyCar(who,who1) {
    console.log('給'+who+who1+'買車');
    }
    function buyBag(who,who1) {
    console.log('給'+who+who1+'買包');
    }
    man.on('有錢了',buyCar);
    //man.on('有錢了',buyBag);//執行幾次,觸發幾次
    man.once('有錢了',buyBag);//執行多次只觸發一次 原理:觸發一次,將自己從數組中移除
    man.removeListener('有錢了',buyCar);//移除事件綁定,再有錢之後不執行買車
    //man.removeListener('有錢了',buyBag);//移除事件綁定,再有錢之後不執行買車   once 移除   執行結果是什麼都沒有了
    man.emit('有錢了','妹子','666');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章