珠峰培训node正式课--【笔记】|全局对象 | process | util | fs | stream 流

全局对象:

console  ;

 __filename     ;  

__dirname     ;  

setTimeOut     ;  

setImmediate(把参数函数放在下一个环节执行)

process对象

    cwd   //当前工作目录   console.log(process.cwd());

  chdir   //修改当前工作目录   process.chdir('..') ;  切换到上一层目录 

  memoryUsage   //内存使用量    process.memoryUsage();    {rss:常驻内存,heapTotal:堆的总内存,heapUsed:堆得已使用内存}

  nextTick    //放在当前任务的末尾

================================

util

  1、inherits   //原型继承,(ChildFun只继承ParentFun原型上的属性与方法)  util.inherits(ChildFun,ParentFun);  var child  = new ChildFun()

  2、inspect

//关于枚举隐藏与强制显示
var util = required(‘util’);
var obj = new Object();
obj.name = 'liujinyu'
Object.defineProperty(obj,'age',{
  value:27,
  configurable:true, //可配置 可删除
  writable:true, //值可以改变
  enumerable:false //不可枚举
})
console.log(util.inspect(obj),{
  showHidden:true //{name:'liujinyu',[age]:27}
})

   3、isArray ;  

  4、isRegExp;

  5、isDate;

fs

  var content = fs.readFileSync('../file.txt',{encoding:'utf8'})  //同步

  fs.readFile('../file.txt',{encoding:'uft8'},(err,data)=>{console.log(data)})  //异步 【!所有异步要晚于同步,所有异步放在下一个清单】

======================================================

【流】

  流的概念:流是一组【有序】的,有【起点】和【终点】的【字节数据传输】手段;

       不关心文件整体内容,文件多大,只关心是否读到、以及读到后的操作处理

       流是一个【抽象接口】,被node中很多对象所实现,比如对一个http服务器的请求对象request是一个流,stdout也是流。

  stream.Readable可读流    

  fs.createReadStream('../file.txt',[opations]);  //opactions: flags对文件何种操作,默认‘r’, encoding , start 开始读取字节读索引位置,

                       //end 结束索引, highWaterMark 最高水位线,却省64kb

 1 var fs = require('fs');
 2 
 3 // 创建之后的流在准备好【接收】之前不会开始【发射】数据
 4 var rs = fs.createReadStream('data/account_0.data',{//创建流
 5     flage:'r',//打开文件之后想干什么  r只读操作   w写操作
 6     // encoding:'utf8'  //默认是buffer
 7     start:10,//读取的字节索引的开始位置
 8     end:30,//读取的字节索引的开始位置
 9     highWaterMark:10//最高水位线,却省默认64kb,一次取多少1字节
10 })
11 
12 //可读流方法
13 rs.setEncoding('utf8');//可以在创建流之后制定编码
14 rs.pause();//通知对象 暂停 触发data事件
15 rs.resume();//通知对象 恢复 触发data事件
16 // rs.pipe();//设置【管道】,将可读流内容导入参数指定的【可写流】
17 
18 // 流是EventEmitter的子类 
19 // 下面是可读流触发的事件 用on来绑定 触发事件有 dataenderror
20 rs.on('data',function(resData){//绑定一个“data”事件监听器,
21     console.log(resData)  //会将流切换到“流动模式”,数据被尽可能快读出
22 })
23 rs.on('end',function(){//读完后触发
24     console.log('读完了')
25 })
26 rs.on('error',function(err){//当数据接收错误时触发
27     console.log(err);
28 })

   stream.writeStream可写流    

var fs = require('fs');
//在fs模块中 用createWriteStream创建一个将流数据写入文件中的 WriteStream对象

var ws = fs.createWriteStream('data/my.data',{
    flags:'a',//默认w r=read w=write a=append
    encoding:'utf8',
    // start:0,// 从第几个字节开始写入
    highWaterMark:5 //却省16kb 设置缓存区大小 最高水位线设5字节 
    // 可以说是控制写入速度  大口大口喂
})

//可写流的方法 
ws.write('1');//write写入缓存区
var flag = ws.write('23456');//flag,是否满足缓存区 highWaterMark 设置的大小
console.log(flag)

ws.on('drain',function(){
    console.log('drain')
})

// 结束写入数据时触发。迫使缓存区中数据立即写入目标对象,调用后不能再写入
ws.end('man');  //向流入写入数据

 【练习】利用流,做一个copy方法,复制文件 copy(file1,file2) copy:file1=>file2

  【pipe】

var fs = require('fs');
//在fs模块中 用createWriteStream创建一个将流数据写入文件中的 WriteStream对象

function copy(file1,file2){
    var rs = fs.createReadStream(file1);
    var ws = fs.createWriteStream(file2);

    rs.on('data',function(d){
        var flag = ws.write(d);
        if(!flag){//当写不进去了
            ws.pause();//暂停写入
        }
    })
    ws.on('drain',function(){//写入流 监听到写完
        ws.resume(); //恢复写入
    })
    rs.on('end',function(){
        ws.end();//当读完的时候也要关闭写入文件
    })
}
// copy('my.js','my1.js')

// ------ 用 pipe 重写 copy (pipe的源码上面的function cope 一样)--------
// 将数据的【制留量】限制到一个可接受的水平,以使得不同速度的来源和目标不会【淹没】可用内存
function copy_pipe(file1,file2){
    var rs = fs.createReadStream(file1);
    var ws = fs.createWriteStream(file2);
    rs.pipe(ws);
}
copy_pipe('my.js','my1.js')

============================================