美文网首页
四、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