Nodejs流模块
2016-09-18 22:33
232 查看
Node.js Stream模块 一、 Readable流
事件: 1、 readable:在数据块可以从流中读取的时候发出。 2、 data:类似于readable,不同之处:当数据的事件处理程序被连接时,流被转变成流动的模式,且数据块处理程序被连续的调用,直至所有数据被调用完。 3、 end:当数据将不再被提供时由流发出 4、 close:关闭时 5、 error:接受数据中出现错误时发出
方法: 1、 read([size]):从流中读取数据 2、 setEncoding(encoding):设置read()读取返回时使用的编码 3、 pause():暂停从该对象发出的data事件 4、 resume():恢复从该对象发出的data事件
自定义Readable流对象: 1、 继承Readable流的功能。使用util模块的inherits()方法 2、 创建对象调用的实例。 3、 调用push()来输出Readable对象中的数据的_read()方法。
二、 Writable流
事件:1、 drain:在write()调用返回false后,当准备好开始写更多的数据时发出此事件2、 finish:当end()在Writable对象上被调用,所有的数据被刷新,且不会有更多的数据将被接受时发出此事件3、 pipe:当pipe()方法在Readable流上被调用,以添加此Writable为目的地时,发出此事件.4、 unpipe: 当unpipe()方法在Readable流上被调用,以删除此Writable为目的地时,发出此事件.
方法:1、 write(chunk,[encoding],[callback]):将数据块写入流对象的数据位置。2、 end(chunk,[encoding],[callback]):与write()相同,除了:end把Writable对象置于不在接受数据状态,并发送finish事件。
自定义Writable流对象:1、 继承Readable流的功能。使用util模块的inherits()方法2、 创建对象调用的实例。3、调用push()来输出Writable对象中的数据的_write(chunk,[encoding],[callback])。
三、 Duplex流(双向流)Duplex是结合可读可写功能的流
自定义Writable流对象:1、 继承Readable流的功能。使用util模块的inherits()方法2、 创建对象调用的实例。3、同时实现Duplex对象中的数据的_read()和_write(chunk,encoding,callback)。
四、 Transform流
1、Transform流扩展了Duplex流,但他修改了Writable流和Readable流之间的数据。2、Transform流不需要实现_read()和_write()原型方法。3、要实现_transform(chunk,encoding,callback)和_flush(callback)方法。Readable流实例:var stream = require("stream");var util = require("util");util.inherits(MyReadable,stream.Readable);function MyReadable(opt){stream.Readable.call(this,opt);this.str = "abcdefg";this._index = 0;}MyReadable.prototype._read = function(){if(this._index>this.str.length){this.push(null);}else{this.push(this.str.charAt(this._index));this._index += 1;}}var r = new MyReadable();console.log("1111"+r.read());r.on("data",function(data){console.log("OK:"+data.toString());//暂停流this.pause();resu();});function resu() {console.log("调用resume后。。。。。");//恢复流r.resume();}r.on("end",function(data){console.log("the ending......");});
<img src="http://img.blog.csdn.net/20160918223416187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
Transform流实例:var http = require("http");var stream = require("stream");var util = require("util");util.inherits(JSONObjectStream,stream.Transform);function JSONObjectStream(opt) {stream.Transform.call(this,opt);}JSONObjectStream.prototype._transform = function(data,encoding,callback){object = data?JSON.parse(data.toString()):""; //转化为JavaScript对象this.emit("object",object); //触发事件object.handled = true;this.push(JSON.stringify(object));//转化为字符串callback();}JSONObjectStream.prototype._flush = function(callback){callback();}http.createServer(function(request,response){response.writeHead(200,{"Content-Type":"text/html;charset = utf-8"});if(request.url !== "/favicon.ico"){var tc = new JSONObjectStream();tc.on("object",function(object){ //绑定事件console.log("name:%s",object.name);console.log("Color:%s",object.color);});tc.on("data",function(data){ //绑定事件console.log("Data:%s",data.toString());});tc.write('{"name":"zhangsan","color":"black"}');tc.write('{"name":"lisi","color":"blue"}');tc.write('{"name":"wangwu","color":"red"}');tc.write('{"name":"zhaoliu","color":"white"}');tc.write('{"name":"liuda","color":"green"}');response.end();}}).listen(8000);console.log("start running......");
<img src="http://img.blog.csdn.net/20160918223425187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
相关文章推荐
- 使用 HTTP 上传 G 级的文件之 Node.js 版本
- mongo实现消息队列
- Node.js压缩web项目中的js,css和图片
- node连接mysql数据库
- 使用 Node.js 构建交互式命令行工具
- async.js 学习记录
- 异步流程控制:7 行代码学会 co 模块
- Node服务一键离线部署
- PM2实用入门指南
- 解放双手:如何在本地调试远程服务器上的Node代码
- 新时代编辑神器:Atom
- rem : web app适配的秘密武器
- jquery高级应用之Deferred对象
- ndm:NPM 的桌面 GUI 程序
- node.js中的fs.mkdir方法使用说明
- 为什么Node.js会这么火呢?Node.js流行的原因
- 究竟什么是Node.js?Node.js有什么好处?
- Linux下为Node.js程序配置MySQL或Oracle数据库的方法
- 三种Node.js写文件的方式