所在的位置: js >> js优势 >> Nodejs教程4stream流

Nodejs教程4stream流

白癜风哪家医院最好 http://www.xftobacco.com/m/
流(stram)在Nod.js中是处理流数据的抽象接口(abstractintrfac)。stram模块提供了基础的API。使用这些API可以很容易地来构建实现流接口的对象。Nod.js提供了多种流对象。例如,HTTP请求和procss.stdout就都是流的实例。流可以是可读的、可写的,或是可读写的。所有的流都是EvntEmittr的实例。

尽管所有的Nod.js用户都应该理解流的工作方式,这点很重要,但是stram模块本身只对于那些需要创建新的流的实例的开发者最有用处。对于主要是消费流的开发者来说,他们很少(如果有的话)需要直接使用stram模块。

1.了解NodStram流

数据流(stram)是处理系统缓存的一种方式。操作系统采用数据块(chunk)的方式读取数据,每收到一次数据,就存入缓存。Nod应用程序有两种缓存的处理方式,第一种是等到所有数据接收完毕,一次性从缓存读取,这就是传统的读取文件的方式(遇上大文件很容易使内存爆仓),第二种是采用数据流的方式,收到一块数据,就读取一块,即在数据还没有接收完成时,就开始处理它(像流水一样)

Nod.js中有四种基本的流类型:Radabl-可读的流,例如fs.cratRadStram()。Writabl-可写的流,例如fs.cratWritStram()。Duplx-可读写的流,例如nt.Sockt。Transform-在读写过程中可以修改和变换数据的Duplx流,例如zlib.cratDflat()。所有的Stram对象都是EvntEmittr的实例

常用的事件有:

data-当有数据可读时触发。nd-没有更多的数据可读时触发。rror-在接收和写入过程中发生错误时触发。finish-所有数据已被写入到底层系统时触发。可读流(Radablstrams)

可读流(Radablstrams)是对提供数据的源头(sourc)的抽象

可读数据流有两种状态:流动状态和暂停状态。处于流动状态时,数据会尽快地从数据源导向用户的程序(就像流水一样);处于暂停态时,必须显式调用stram.rad()等指令,可读数据流才会释放数据,(就像流水的闸门,打开它水才继续流下去)

可读流在创建时都是暂停模式,暂停模式和流动模式可以互相转换。

要从暂停模式切换到流动模式,有下面三种办法:

给“data”事件关联了一个处理器显式调用rsum()调用pip()方法将数据送往一个可写数据流

要从流动模式切换到暂停模式,有两种途径:

如果这个可读的流没有桥接可写流组成管道,直接调用paus()如果这个可读的流与若干可写流组成了管道,需要移除与data事件关联的所有处理器,并且调用unpip()方法断开所有管道可读流常用事件:radabl:在数据块可以从流中读取的时候发出。它对应的处理器没有参数,可以在处理器里调用rad([siz])方法读取数据。data:有数据可读时发出。它对应的处理器有一个参数,代表数据。如果你只想快快地读取一个流的数据,给data关联一个处理器是最方便的办法。处理器的参数是Buffr对象,如果你调用了Radabl的stEncoding(ncoding)方法,处理器的参数就是String对象。nd:当数据被读完时发出。对应的处理器没有参数。clos:当底层的资源,如文件,已关闭时发出。不是所有的Radabl流都会发出这个事件。对应的处理器没有参数。rror:当在接收数据中出现错误时发出。对应的处理器参数是Error的实例,它的mssag属性描述了错误原因,stack属性保存了发生错误时的堆栈信息。可读流还提供了一些方法,我们可以用它们读取或操作流:rad([siz]):该方法可以接受一个整数作为参数,表示所要读取数据的数量,然后会返回该数量的数据。如果读不到足够数量的数据,返回null。如果不提供这个参数,默认返回系统缓存之中的所有数据。stEncoding(ncoding):给流设置一个编码格式,用于解码读到的数据。调用此方法后,rad([siz])方法返回String对象。paus():暂停可读流,不再发出data事件rsum():恢复可读流,继续发出data事件pip(dstination,[options]):绑定一个Writabl到radabl上,将可写流自动切换到flowing模式并将所有数据传给绑定的Writabl。数据流将被自动管理。这样,即使是可读流较快,目标可写流也不会超负荷(ovrwhlmd)unpip([dstination]):该方法移除pip方法指定的数据流目的地。如果没有参数,则移除所有的pip方法目的地。如果有参数,则移除该参数指定的目的地。如果没有匹配参数的目的地,则不会产生任何效果可写流(Writablstrams)

Writablstrams是dstination的一种抽象,这种dstination允许数据写入

writ方法用于向可写数据流写入数据。它接受两个参数,一个是写入的内容,可以是字符串,也可以是一个stram对象(比如可读数据流)或buffr对象(表示二进制数据),另一个是写入完成后的回调函数,它是可选的,writ方法返回一个布尔值,表示本次数据是否处理完成

可写流常用事件drainwritabl.writ(chunk)返回fals以后,当缓存数据全部写入完成,可以继续写入时,会触发drain事件finish调用nd方法时,所有缓存的数据释放,触发finish事件。该事件的回调函数没有参数pip可写数据流调用pip方法,将数据流导向写入目的地时,触发该事件unpip可读数据流调用unpip方法,将可写数据流移出写入目的地时,触发该事件rror如果写入数据或pip数据时发生错误,就会触发该事件可写流常用方法writ()用于向可写数据流写入数据。它接受两个参数,一个是写入的内容,可以是字符串,也可以是一个stram对象(比如可读数据流)或buffr对象(表示二进制数据),另一个是写入完成后的回调函数,它是可选的。cork(),uncork()cork方法可以强制等待写入的数据进入缓存。当调用uncork方法或nd方法时,缓存的数据就会吐出。stDfaultEncoding()用于将写入的数据编码成新的格式。它返回一个布尔值,表示编码是否成功,如果返回fals就表示编码失败。nd()用于终止可写数据流。该方法可以接受三个参数,全部都是可选参数。第一个参数是最后所要写入的数据,可以是字符串,也可以是stram对象或buffr对象;第二个参数是写入编码;第三个参数是一个回调函数,finish事件发生时,会触发这个回调函数。管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中,我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pip)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。

千言万语抵不过这图:

链式流

链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制。链式流一般用于管道操作,接下来我们就是用管道和链式来压缩文件创建


转载请注明:http://www.aierlanlan.com/grrz/7205.html

  • 上一篇文章:
  •   
  • 下一篇文章: