ImageVerifierCode 换一换
格式:DOC , 页数:7 ,大小:45.50KB ,
资源ID:9717936      下载积分:6 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9717936.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Nodejs-Stream-数据流使用手册.doc)为本站上传会员【精***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Nodejs-Stream-数据流使用手册.doc

1、   这篇文章主要介绍了Nodejs Stream 数据流使用手册的相关资料,感兴趣的小伙伴一起学习吧   1、介绍   本文介绍了使用 node.js streams 开发程序的基本方法。   <code class="hljs mizar">"We should have some ways of connecting programs like garden hose--screw in   another segment when it becomes necessary to massage data in   another way. This is t

2、he way of IO also."   Doug McIlroy. October 11, 1964</code>   最早接触Stream是从早期的unix开始的数十年的实践证明Stream 思想可以很简单的开发出一些庞大的系统。在unix里,Stream是通过 |实现的;在node中,作为内置的stream模块,很多核心模块和三方模块都使用到。和unix一样,node Stream主要的操作也是.pipe(),使用者可以使用反压力机制来控制读和写的平衡。   Stream 可以为开发者提供可以重复使用统一的接口,通过抽象的Stream接口来控制Stream之间的读写平

3、衡。   2、为什么使用Stream   node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据,下面是一个文件下载服务器的简单代码:   <code class="hljs javascript">var http = require('http');   var fs = require('fs');   var server = http.createServer(function (req, res) {   fs.readFile(__dirname + '/data.txt', function (err, data) {   res

4、end(data);   });   });   server.listen(8000);</code>   这些代码可以实现需要的功能,但是服务在发送文件数据之前需要缓存整个文件数据到内存,如果"data.txt"文件很大且并发量很大的话,会浪费很多内存。因为用户需要等到整个文件缓存到内存才能接受的文件数据,这样导致用户体验相当不好。不过还好(req, res)两个参数都是Stream,这样我们可以用fs.createReadStream()代替fs.readFile():   <code class="hljs javascript">var http

5、 require('http');   var fs = require('fs');   var server = http.createServer(function (req, res) {   var stream = fs.createReadStream(__dirname + '/data.txt');   stream.pipe(res);   });   server.listen(8000);</code>   .pipe()方法监听fs.createReadStream()的'data' 和'end'事件,这样"data.txt"文件就不需要缓

6、存整个文件,当客户端连接完成之后马上可以发送一个数据块到客户端。使用.pipe()另一个好处是可以解决当客户端延迟非常大时导致的读写不平衡问题。如果想压缩文件再发送,可以使用三方模块实现:   <code class="hljs javascript">var http = require('http');   var fs = require('fs');   var oppressor = require('oppressor');   var server = http.createServer(function (req, res) {   var stream

7、 fs.createReadStream(__dirname + '/data.txt');   stream.pipe(oppressor(req)).pipe(res);   });   server.listen(8000);</code>   这样文件就会对支持gzip和deflate的浏览器进行压缩。oppressor 模块会处理所有的content-encoding。   Stream使开发程序变得简单。   3、基础概念   有五种基本的Stream: readable, writable, transform, duplex, and”classic

8、   3-1、pipe   所有类型的Stream收是使用 .pipe() 来创建一个输入输出对,接收一个可读流src并将其数据输出到可写流dst,如下:   <code class="hljs perl">src.pipe(dst)</code>   .pipe( dst )方法为返回dst流,这样就可以接连使用多个.pipe(),如下:   <code class="hljs perl">a.pipe( b ).pipe( c ).pipe( d )</code>   功能与下面的代码相同:   <code class

9、"hljs perl">a.pipe( b );   b.pipe( c );   c.pipe( d );</code>   3-2、readable streams   通过调用Readable streams的 .pipe()方法可以把Readable streams的数据写入一个Writable , Transform, 或者Duplex stream。   <code class="hljs perl">readableStream.pipe( dst )</code>   1>创建 readable stream   

10、这里我们创建一个readable stream!   <code class="hljs perl">var Readable = require('stream').Readable;   var rs = new Readable;   rs.push('beep ');   rs.push('boop\n');   rs.push(null);   rs.pipe(process.stdout);   $ node read0.js   beep boop   </code>   rs.push( null ) 通知数据接收者数据已经发送完毕.

11、   注意到我们在将所有数据内容压入可读流之前并没有调用rs.pipe(process.stdout);,但是我们压入的所有数据内容还是完全的输出了,这是因为可读流在接收者没有读取数据之前,会缓存所有压入的数据。但是在很多情况下, 更好的方法是只有数据接收着请求数据的时候,才压入数据到可读流而不是缓存整个数据。下面我们重写 一下._read()函数:   <code class="hljs javascript">var Readable = require('stream').Readable;   var rs = Readable();   var c = 97;

12、  rs._read = function () {   rs.push(String.fromCharCode(c++));   if (c > 'z'.charCodeAt(0)) rs.push(null);   };   rs.pipe(process.stdout);</code>   <code class="hljs bash">$ node read1.js   abcdefghijklmnopqrstuvwxyz</code>   上面的代码通过重写_read()方法实现了只有在数据接受者请求数据才向可读流中压入数据。_

13、read()方法也可以接收一个size参数表示数据请求着请求的数据大小,但是可读流可以根据需要忽略这个参数。   注意我们也可以用util.inherits()继承可读流。为了说明只有在数据接受者请求数据时_read()方法才被调用,我们在向可读流压入数据时做一个延时,如下:   <code class="hljs javascript">var Readable = require('stream').Readable;   var rs = Readable();   var c = 97 - 1;   rs._read = function () {   if (

14、c >= 'z'.charCodeAt(0)) return rs.push(null);   setTimeout(function () {   rs.push(String.fromCharCode(++c));   }, 100);   };   rs.pipe(process.stdout);   process.on('exit', function () {   console.error('\n_read() called ' + (c - 97) + ' times');   });   process.stdout.on('error', proce

15、ss.exit);</code>   用下面的命令运行程序我们发现_read()方法只调用了5次:   <code class="hljs bash">$ node read2.js | head -c5   abcde   _read() called 5 times</code>   使用计时器的原因是系统需要时间来发送信号来通知程序关闭管道。使用process.stdout.on('error', fn) 是为了处理系统因为header命令关闭管道而发送SIGPIPE信号,因为这样会导致process.stdout触发EPIPE事件。如果想创

16、建一个的可以压入任意形式数据的可读流,只要在创建流的时候设置参数objectMode为true即可,例如:Readable({ objectMode: true })。   2>读取readable stream数据   大部分情况下我们只要简单的使用pipe方法将可读流的数据重定向到另外形式的流,但是在某些情况下也许直接从可读流中读取数据更有用。如下:   <code class="hljs php">process.stdin.on('readable', function () {   var buf = process.stdin.read();   con

17、sole.dir(buf);   });   $ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume0.js    <buffer 0a="" 61="" 62="" 63="">   <buffer 0a="" 64="" 65="" 66="">   <buffer 0a="" 67="" 68="" 69="">   null</buffer></buffer></buffer></code>   当可读流

18、中有数据可读取时,流会触发'readable' 事件,这样就可以调用.read()方法来读取相关数据,当可读流中没有数据可读取时,.read() 会返回null,这样就可以结束.read() 的调用, 等待下一次'readable' 事件的触发。下面是一个使用.read(n)从标准输入每次读取3个字节的例子:   <code class="hljs javascript">process.stdin.on('readable', function () {   var buf = process.stdin.read(3);   console.dir(buf);   })

19、lt;/code>   如下运行程序发现,输出结果并不完全!   <code class="hljs bash">$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume1.js    <buffer 61="" 62="" 63="">   <buffer 0a="" 64="" 65="">   <buffer 0a="" 66="" 67=""></buffer></buffer></buffer>&l

20、t;/code>   这是应为额外的数据数据留在流的内部缓冲区里了,而我们需要通知流我们要读取更多的数据.read(0)可以达到这个目的。   <code class="hljs javascript">process.stdin.on('readable', function () {   var buf = process.stdin.read(3);   console.dir(buf);   process.stdin.read(0);   });</code>   这次运行结果如下:   <code class="hljs xml"

21、gt;$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume2.js    <buffer 0a="" 64="" 65="">   <buffer 0a="" 68="" 69=""></buffer></buffer></code>   我们可以使用 .unshift() 将数据重新押回流数据队列的头部,这样可以接续读取押回的数据。如下面的代码,会按行输出标准输入的内容:   <code class="hljs javascrip

22、t">var offset = 0;   process.stdin.on('readable', function () {   var buf = process.stdin.read();   if (!buf) return;   for (; offset < buf.length; offset++) {   if (buf[offset] === 0x0a) {   console.dir(buf.slice(0, offset).toString());   buf = buf.slice(offset + 1);   offset = 0;   

23、process.stdin.unshift(buf);   return;   }   }   process.stdin.unshift(buf);   });   $ tail -n +50000 /usr/share/dict/american-english | head -n10 | node lines.js    'hearties'   'heartiest'   'heartily'   'heartiness'   'heartiness\'s'   'heartland'   'heartland\'s'   'heartlands'

24、   'heartless'   'heartlessly'</code>   当然,有很多模块可以实现这个功能,如:split 。   3-3、writable streams   writable streams只可以作为.pipe()函数的目的参数。如下代码:   <code class="hljs perl">src.pipe( writableStream );</code>   1>创建 writable stream   重写 ._write(chunk, enc, next) 方法就可以接受一个readable stre

25、am的数据。   <code class="hljs php">var Writable = require('stream').Writable;   var ws = Writable();   ws._write = function (chunk, enc, next) {   console.dir(chunk);   next();   };   process.stdin.pipe(ws);   $ (echo beep; sleep 1; echo boop) | node write0.js    <buffer 0a="" 62

26、"" 65="" 70="">   <buffer 0a="" 62="" 6f="" 70=""></buffer></buffer></code>   第一个参数chunk是数据输入者写入的数据。第二个参数end是数据的编码格式。第三个参数next(err)通过回调函数通知数据写入者可以写入更多的时间。如果readable stream写入的是字符串,那么字符串会默认转换为Buffer,如果在创建流的时候设置Writable({ decodeStrings: false })参数,那么不会做转换。如果readable stream

27、写入的数据时对象,那么需要这样创建writable stream   <code class="hljs css">Writable({ objectMode: true })</code>   2>写数据到 writable stream   调用writable stream的.write(data)方法即可完成数据写入。   <code class="hljs vala">process.stdout.write('beep boop\n');</code>   调用.end()方法通知writable stream 数据已

28、经写入完成。   <code class="hljs javascript">var fs = require('fs');   var ws = fs.createWriteStream('message.txt');   ws.write('beep ');   setTimeout(function () {   ws.end('boop\n');   }, 1000);   $ node writing1.js    $ cat message.txt   beep boop</code>   如果需要设置writable stre

29、am的缓冲区的大小,那么在创建流的时候,需要设置opts.highWaterMark,这样如果缓冲区里的数据超过opts.highWaterMark,.write(data)方法会返回false。当缓冲区可写的时候,writable stream会触发'drain' 事件。   3-4、classic streams   Classic streams比较老的接口了,最早出现在node 0.4版本中,但是了解一下其运行原理还是十分有好   处的。当一个流被注册了"data" 事件的回到函数,那么流就会工作在老版本模式下,即会使用老的API。   1>classic readabl

30、e streams   Classic readable streams事件就是一个事件触发器,如果Classic readable streams有数据可读取,那么其触发 "data" 事件,等到数据读取完毕时,会触发"end" 事件。.pipe() 方法通过检查stream.readable 的值确定流是否有数据可读。下面是一个使用Classic readable streams打印A-J字母的例子:   <code class="hljs javascript">var Stream = require('stream');   var stream = new Str

31、eam;   stream.readable = true;   var c = 64;   var iv = setInterval(function () {   if (++c >= 75) {   clearInterval(iv);   stream.emit('end');   }   else stream.emit('data', String.fromCharCode(c));   }, 100);   stream.pipe(process.stdout);   $ node classic0.js   ABCDEFGHIJ</code&

32、gt;   如果要从classic readable stream中读取数据,注册"data" 和"end"两个事件的回调函数即可,代码如下:   <code class="hljs php">process.stdin.on('data', function (buf) {   console.log(buf);   });   process.stdin.on('end', function () {   console.log('__END__');   });   $ (echo beep; sleep 1; echo boop) | node classi

33、c1.js    <buffer 0a="" 62="" 65="" 70="">   <buffer 0a="" 62="" 6f="" 70="">   __END__</buffer></buffer></code>   需要注意的是如果你使用这种方式读取数据,那么会失去使用新接口带来的好处。比如你在往一个 延迟非常大的流写数据时,需要注意读取数据和写数据的平衡问题,否则会导致大量数据缓存在内存中,导致浪费大量内存。一般这时候强烈建议使用流的.pipe()方法,这样就不用自己监听”data” 和”end”事件了

34、也不用担心读写不平衡的问题了。当然你也可以用 through代替自己监听”data” 和”end” 事件,如下面的代码:   <code class="hljs php">var through = require('through');   process.stdin.pipe(through(write, end));   function write (buf) {   console.log(buf);   }   function end () {   console.log('__END__');   }   $ (echo beep; sleep

35、1; echo boop) | node through.js    <buffer 0a="" 62="" 65="" 70="">   <buffer 0a="" 62="" 6f="" 70="">   __END__</buffer></buffer></code>   或者也可以使用concat-stream来缓存整个流的内容:   <code class="hljs oxygene">var concat = require('concat-stream');   process.stdi

36、n.pipe(concat(function (body) {   console.log(JSON.parse(body));   }));   $ echo '{"beep":"boop"}' | node concat.js    { beep: 'boop' }</code>   当然如果你非要自己监听"data" 和"end"事件,那么你可以在写数据的流不可写的时候使用.pause()方法暂停Classic readable streams继续触发”data” 事件。等到写数据的流可写的时候再使用.resume() 方法通知流继续触发"data" 事件

37、继续读取   数据。   2>classic writable streams   Classic writable streams 非常简单。只有 .write(buf), .end(buf)和.destroy()三个方法。.end(buf) 方法的buf参数是可选的,如果选择该参数,相当于stream.write(buf); stream.end() 这样的操作,需要注意的是当流的缓冲区写满即流不可写时.write(buf)方法会返回false,如果流再次可写时,流会触发drain事件。   4、transform   transform是一个对读入数据过滤然输出的流。

38、  5、duplex   duplex stream是一个可读也可写的双向流,如下面的a就是一个duplex stream:   <code class="hljs livecodeserver">a.pipe(b).pipe(a)</code>   以上内容是小编给大家介绍的Nodejs Stream 数据流使用手册,希望对大家有所帮助!   

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服