您的位置:首页 > Web前端 > Node.js

node.js 的stream(流)和模块系

2015-12-10 12:14 495 查看
//Stream (流)是一个抽象接口,Node中很多对象都实现了这个接口,For example: 对http 服务器发起请求的reques对象就是Stream,还有stdout(标准输出).
//Node.js 的Stream有四种流类型:Readable---可读类型,Writeable--可写类型, Duplex---可读可写类型, Transform----操作被写入数据,然后读出结果。
//所有的stream对象都是EventEmitter的实例。常用的事件有:data----有数据可读是触发,end----没有更多数据可读时触发,error---在接收和写入过程发生错误时触发,finish---所有数据已被写入到底层系统时触发。

var fs = require('fs');//引入模块
var data = '';

//创建可读流
var readerStream = fs.createReadStream('soul.txt');

//设置编码为utf8
readerStream.setEncoding('UTF8');

//处理流事件--》data,end,error;
readerStream.on('data',function(chunk){
data += chunk;
console.log('readStream on one:'+chunk);
});

//流读取完了执行
readerStream.on('end',function(){
console.log('data stream all:'+data);
});

//流读取遇到错误
readerStream.on('error',function(err){
console.log(err.stack);
});

//管道流实现复制
var writerStream = fs.createWriteStream('output.txt');
//管道读写操作用pipe方法,
readerStream.pipe(writerStream);//读取solu.txt文件内容并且写入到output.txt文件中,如果找不到output文件则会创建一个output的新文件

//链式流
var zlib = require('zlib');//引入模块
fs.createReadStream('soul.txt').pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));//创建一个可读流然后写入到一个刚创建的流中然后再写入一个可写入的流中
console.log('压缩完成');

//解压文件,把input文件解压成input_copy
fs.createReadStream('input.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('input_copy.txt'));//获取可读流--》创建一个流存放读取到的流信息---》创建一个可写入的流写入流信息
console.log("compelete:"+JSON.stringify(fs.createReadStream('input.txt.gz')));

//node.js模块系统,如果有使用require.js的经历,对node.js模块系统理解就非常容易了,因为require的模块就是借鉴node的AMD写法的,一个模块一个文件,通过require方法获取其他模块
var hello = require('./hello');//获取hello模块,./是表示当前目录
hello.world(); //调用hello模块里面的world()方法;
exports.world=function(){//exports是模块公开的接口,就是其他模块可以访问到的一个对象,可以把需要共享的方法封装到对象的属性里面去,这样就能实现对外共享了
console.log('Hello world');
}

//有时候我们的模块是一些基本配置,只是想把配置封装到模块中,可以让其他模块直接访问到配置,不需要通过exports对象,方法如下:
module.exports = function(){//setName.js代码
var name;
this.setName = function(thyName){
name = thyName;
}
}

var setName = require('seName');//引入模块
setName = new setName();//由于返回的是一个函数,所以需要实例化
setName('mao gui you');//执行setName方法
console.log(setName.name);//mao gui you

//ps:require 加载优先级是:文件模块缓冲区>原生模块>文件模块,而且始终在文件模块缓冲区中加载模块,如果在缓冲区没有,则去加载原生模块或者载入文件模块然后缓存在缓冲区,然后再从缓冲区加载模块
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  node.js 模块系统