Streams是一种基于事件的API,用于高效地管理和处理数据。借助事件和非阻塞I/O库,流模块允许在可用时动态处理,在不需要时释放。使用流的好处举个读取文件的例子:使用fs.readFileSync同步读取一个文件,程序会被阻塞,所有数据都会读入内存。使用fs.readFile来读取文件,程序不会被阻塞,但所有数据仍然会被一次性读入内存。在处理大文件压缩、归档、媒体文件和巨大的日志文件时,内存使用成为一个问题,在这种情况下,流的优势就体现出来了。流被设计为异步的。与一次性将剩余的文件数据读入内存相比,值得读取一个缓冲区,将执行所需的操作,并将结果写入输出流。流的分类stream.Readable---用于获取I/Ostream上的数据。Writable---用于写入数据的stream.Duplexattheoutputtarget---一个可读可写的Stream,比如一个网络连接stream.Transform---以某种方式修改数据的双工流创建可读流方法-varStream=require('stream')varreadable=Stream.Readable();varsource=['a','b','c'];readable._read=function(){this.push(source.shift()||null);}readable.pipe(process.stdin);方法二varReadable=require('stream').Readable;functionMyStream(options){Readable.call(this,options);}MyStream.prototype=Object.create(Readable.prototype,{constructor:{value:MyStream}});MyStream.prototype._read=function(){this.push("hello");this.push(null);}varstreams=newMyStream();streams.pipe(进程.stdin);方法三varstream=require('stream');varutil=require('util');functionMyStream(options){stream.Readable.call(this,options);}MyStream.prototype._read=function(size){this.push('hello');this.push(null);}util.inherits(MyStream,stream.Readable);varstreams=newMyStream();streams.pipe(process.stdout);可读流的一些概念可读流是提供数据源的抽象可读流的实例http响应,在客户端http请求,在服务器fs读取流zlibstreamscryptostreamsTCPsocketschild进程stdout和stderrprocess.stdin可读流模式可读流有两种工作模式:流动和暂停。在流动模式下,可读流自动从系统底层读取数据,并通过EventEmitter接口的事件第一时间将数据提供给应用程序。可读流被创建它总是处于暂停模式。可读流可以在两种模式下切换。暂停模式下的可读流可以通过以下三种方式切换到流动模式:监听'data'事件,调用stream.resume()方法调用stream.pipe()方法向Writable发送数据流动模式下的可读流。您可以通过以下两种方式切换到暂停模式:如果没有管道目标,可以调用stream.pause()方法。如果有管道Target,可以实现可读流事件,取消'data'事件监听,调用stream.unpipe()方法移除所有管道可读流提供如下事件:'close'事件,将被关闭当流或底层资源被触发后,但不是所有的流都会触发事件。'data'事件,当流将数据传递给消费者时,将触发数据事件。当流转换为f当数据处于低模式时触发此事件。‘end’事件,结束事件只有在数据被完全消费后才会触发。传递错误数据时发生。'readble'事件,当流中有数据需要读取时会触发readable事件。--待续--
