根据心情整理一些node的api~
今天第一篇,node的流;node的流比较重要,node的流存在于node的各个模块,包括输入输出流,stdin,stout。fs读取流,zlib流,crypto流,tcp套接字等等,node很重要的net,http模块都用到了流的概念,留到以后再说。还有gulp的流也是来源于node的流。express的中间件,也被应用于各大框架……
nodejs流,所有流都是EventEmitter的实例,流包括了Readable,writable,Duplex,Transform流;这是流的分类。
Stream,数据出自一个readable流,在就绪接受之前,readable流不会发生数据。
readable流有流动模式和暂停模式(默认)两种模式;处于暂停模式时,必须明确调用stream.read()取出若干数据块。
如果没有绑定data事件处理,也没有pipe()目标,处于流动模式,数据会流失
·some ways change to流动模式
1,添加一个data事件监听
2,调用resume()开启数据流
3,调用pipe()将数据发送到一个writable
some ways change to暂停模式
1,如果没有导流目标,调用pasuse()
2,如果有导流弥补,移出所有data监听器,调用unpipe()移除所有导流目标
tips:移出data监听器并不会暂停流,当有导流目标时,调用pause()并不能保证流在哪些目标排空并请求更多数据时维持暂停状态
一些可读流的例子:
客户端上的http响应
服务器上的http请求
fs读取流
zlib流
crypto流
tcp嵌套字
子进程的stdout和stderr
流的事件:
//readable事件
当一个数据块可以从流中被读出,会触发一个readable事件
var readable=getReadableStreamSomehow(); readable.on('readable',function(){ //有数据可读 })
//data事件
var readable=getReadableStreamSomehow(); readable.on('data',function(chunk){ console.log('得到了%d字节的数据',chunk.length); })
后面node好多模块都可以监听data来接收事件,比如http的server,也可以用pipe()传数据给客户端。
//end事件
在没有更多数据能提供时被触发;在数据被完全消费之前不会被触发,
// close事件底层数据源被关闭时触发,不是所有流都会触发
//error事件数据接收错误触发
//readable.read([size])
read()从内部缓存区中拉取返回若干数据,没有更多数据时会返回null,指定size会返回相当字节的数据
仅在暂停模式时被调用
var readable=getReadableStreamSomehow(); readable.setEncoding('utf8') readable.on('readable',function(){ var chunk; while(null!==(chunk=readable.read())){ console.log('得到了%d字节的数据',chunk.length); } })
//readable.setEncoding(encoding)
//readable.resume()返回this可以让可读流继续触发data事件
//readable.pause()让处于流动模式的流停止触发data事件,切换到非流动模式,并让都需可用数据留在内部缓冲区
//readable.pipe(destination,[options])写入数据的目标;导流选项options,end在读取者结束时结束写入者,缺省为true
=>可以从可读流中拉取所有数据,并写入到所提供的目标,该方法能自动控制流量以避免目标被快速读取的可读流淹没
var readable=getReadableStreamSomehow(); var writable=fs.createWriteStream('files.txt'); readable.pipe(writable);//返回目标流
//readable.unpipe()就不说了-0-前面提到了。