美文网首页
四、node(二)

四、node(二)

作者: sheepmiee | 来源:发表于2017-04-25 17:37 被阅读13次

    node模块

    文件模块
    内置模块
    第三方模块

    内置模块

    util

    util.inherits(Child,Parent)
    继承,原理es6的继承方法:Object.setPrototypeOf(Child.prototype,Parent.prototype);只继承公有方法

    var util = require('util');
    util.inherits();
    
    Buffer

    Buffer详解
    Buffer是global上的属性,为全局对象

    常用全局属性: setTimeout setInterval process setImmediate console Buffer 形参(exports,require,module,__dirname , __filename)
    Buffer展现给我们的是16进制,utf8一个汉字 代表3个字节,一个字节由八个位组成Bit

    • buffer创建
      三种方式(固定大小): 长度创建 字符串创建 数组创建
      var buffer = new Buffer(6)//6个字节
      buffer.fill(257);//257对256取模
      console.log(buffer);//<Buffer 01 01 01 01 01 01 >//6字节 没有fill则随机

    var buffer = new Buffer('开心');
    console.log(buffer);//

    var buffer = new Buffer([100,120,16]);
    console.log(buffer);//<Buffer 64 78 f0>

    var buffer = new Buffer([0xfe,0xff,0x16]);
    console.log(buffer);//<Buffer fe ff 16>

    • buffer里存储的是内存地址
      buffer类似于数组:
    var obj = {name:1};
    var arr = [obj,1,2];
    var newArr = arr.slice(0); 
    obj.name = 2;
    console.log(newArr);//[{name:2},1,2]
    

    buffer:存储的都是内存地址

    var buffer = new Buffer([1,2,3]);
    var newBuffer = buffer.slice(0,1);
    newBuffer[0]=2;
    console.log(buffer)//<Buffer 02 02 03>
    
    • buffer的write方法
      //参数:string,往里面写的字符串 offset,偏移量 length,写入的长度 encoding 默认是utf8
      var buffer = new Buffer(12);
      buffer.write('珠峰',0,6);
      buffer.write('培训',6,6);
      console.log(buffer.toString())//珠峰培训

    buffer.forEach(function (item){
    console.log(item)//得到的是十进制
    });

    • buffer的copy方法 将小buffer拷贝到大buffer
      //参数:targetBuffer,目标buffer targetStart,目标的开始 sourceStart,源的开始
      var buffer = new Buffer(12);
      var buf1 = new Buffer('珠峰');
      var buf2 = new Buffer('培训');
      buf1.copy(buffer,0);
      buf2.copy(buffer,6);
      console.log(buffer.toString());//

    • Buffer的concat方法
      //参数:list,totalLength
      var buf1 = new Buffer('珠峰');
      var buf2 = new Buffer('培训');
      console.log(Buffer.concat([buf1,buf2],1000).toString);//长度1000,多的补零
      原理是利用copy方法,下面我们自己模拟一个concat方法:

    //1.判断长度是否传递,如果给了长度就构建一个buffer,将小buffer依次拷贝到大buffer上,过长则将多余的部分 截取掉slice()截取有效长度
    //2.手动维护长度 在构建buffer,将小buffer依次拷贝到大buffer上 copy
    
    Buffer.myConcat = function (list,totalLength) {
        //1.判断长度是否传递
        if(typeof totalLength == "undefined"){
            totalLength = 0;
            list.forEach(function (item) {
                totalLength += item.length;
            });
        }
        var buffer = new Buffer(totalLength);//1000
        var index = 0;
        list.forEach(function (item) {
            item.copy(buffer,index);
            index+= item.length;
        });
        return buffer.slice(0,index);
    };
    console.log(Buffer.concat([buf1,buf2,buf1,buf2]).toString());
    
    进制转换
    • parseInt 任意进制转10进制
    parseInt('11100011',2);//
    
    • toString 任意进制转任意进制
    (0x16).toString(10);//16转10,结果26
    
    • base64
      base64不是一个加密算法,加密:md5 sha1 sha256
    • 汉字转base64 '珠' => 54+g 38=>64
      2进制装换成10进制不得大于64,得到的结果在可见编码中取值
      base64转换原理代码:
    //将汉字转换成2进制
    var buffer = new Buffer('珠');
    console.log(buffer); //0xe7 0x8f 0xa0
    console.log((0xe7).toString(2)); //11100111
    console.log((0x8f).toString(2)); //10001111
    console.log((0xa0).toString(2)); //10100000
    
    //将2进制转换成10进制
    console.log(parseInt('00111001',2)); //57
    console.log(parseInt('00111000',2)); //56
    console.log(parseInt('00111110',2)); //62
    console.log(parseInt('00100000',2)); //32
    
    //查找
    var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    str+= 'abcdefghijklmnopqrstuvwxyz';
    str+='0123456789';
    str+='+/';
    console.log(str[57]+str[56]+str[62]+str[32]);//54+g
    

    fs模块 file system

    十组常用的fs模块方法
    readFileSync readFile
    writeFile writeFileSync
    appendFile appendFileSync
    path.resolve() path.join() 给一个相对路径 解析一个绝对路径
    mkdirSync mkdir 创建目录
    rmdirSync rmdir 删除目录
    unlinkSync unlink 删除文件
    readdirSync readdir 读取目录
    existsSync exists 是否存在
    statSync stat 判断文件状态

    const fs = require('fs');
    能用异步绝不用同步
    fs.readFileSync

    读取文件不存在会报错
    读取默认格式是buffer类型 相当于encoding:null

    • readFileSync 同步读取
      var result = fs.readFileSync('./1.txt,'utf8')
    • readFile 异步读取
      fs.readFile('./1.txt,'utf8',function(error,data){
      if(error)console.log(error);
      console.log(data);
      });
      解决异步问题:
    var school = {}; 
    fs.readFile('./name.txt','utf8',function (e,data) { //error-first
        if(e)console.log(e);
        school.name = data;
        out();
    });
    fs.readFile('./age.txt','utf8',function (e,data) { //error-first
        if(e)console.log(e);
        school.age = data;
        out();
    });
    function out() {
        if(Object.keys(school).length == 2){
            console.log(school); //{name:'珠峰培训',age:8}
        }
    }
    
    • write
      1如果写的文件不存在,会创建文件
      2默认写入的格式是utf8
      3文件有内容,原来的内容会被覆盖
    fs.writeFileSync('./a.txt',new Buffer('珠峰'));//写入的是'珠峰',因为默认是utf8格式,会默认toString('utf8')
    
    • write async
    fs.writeFile('./a.txt',new Buffer('珠峰'),function(err){});
    

    不覆盖写入2中方法:

     fs.appendfile(target,data,,function (err) {})
     fs.writeFile(target,data,{encoding:'utf8',flag:'a'},function (err) {});
    
    • path.resolve path.join
    var path  = require('path');
    console.log(path.resolve('1.js'));//以当前路径解析出一个相对路径
    console.log(path.join(__dirname,'1.js'));//相当于resolve
    
    • 两个函数模拟:copy copyAsync
    function copy(source,target) {//异步
        //先读在写
        fs.readFile(source,function (err,data) {
            if(err)console.log(err);
            //appendFile可以进行累加,不清空内容写入
            fs.writeFile(target,data,{encoding:'utf8',flag:'a'},function (err) {
                if(err)console.log(err);
                console.log('拷贝成功');
            });
        });
    }
    copy('./name.txt','./name1.txt');
    
    function copySync(source,target) { //同步
        var result = fs.readFileSync(source);
        fs.writeFileSync(target,result);
    }
    copySync('./name.txt','./name1.txt');
    
    • mkdirSync和mkdir
      创建目录
      函数模拟,内置的方法不能一次创建多级目录,
      函数模拟:同步创建文件夹
    function makepSync(p) {
        var arr = p.split('/'); 
        for(var i = 0;i<arr.length;i++){
            var path = arr.slice(0,i+1).join('/');
            if(!fs.existsSync(path)){//exists两个值true false
                fs.mkdirSync(path)
            }
        }
    }
    makep('a/b/c/d/e/f')
    

    函数模拟:异步创建文件夹

    //写一个异步创建  mkdir + exists
    //递归   mkdir + exists  插入排序
    function makep(p) {
        var paths = p.split('/');
        var index = 1;
        function makeOne(subpath) {
            if(paths.length == index-1){
                return;
            }
            fs.exists(subpath,function (flag) {
                var temp = paths.slice(0,++index).join('/');
                if(!flag){ //不存在的时候创建
                    fs.mkdir(subpath,function () {
                        makeOne(temp);// a/b
                    });
                }else{ //存在的时候继续下一次
                    makeOne(temp);
                }
            });
        }
        makeOne(paths[index-1]);
    }
    makep('a/b/c/d/e/f');
    

    相关文章

      网友评论

          本文标题:四、node(二)

          本文链接:https://www.haomeiwen.com/subject/vgovzttx.html