四、node(二)

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');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScr...
    FTOLsXD阅读 530评论 0 2
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,449评论 1 37
  • 一、核心模块和对象 核心模块的意义 常用内置模块path:处理文件路径fs:操作文件系统child_process...
    EndEvent阅读 4,406评论 0 1
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,301评论 0 6
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,607评论 2 41