从Node.js API文档中可知,

  'A stream is an abstract interface implemented by various objects in Node. For example a request to an HTTP server is a stream, as is stdout. Streams are readable, writable, or both. All streams are instances of EventEmitter。''流是很多I/0操作的抽象,被 Node 中的很多对象所实现。比如对一个 HTTP 服务器的请求是一个流(可读流)(服务器的响应是一个流(可写流)),stdout也是流。流是可读、可写或兼具两者的。所有流都是 EventEmitter 的实例。'

一.  为什么需要流(Stream)?

  举个例子,如果要读取一个文件,一次性读取需要占用大内存,是不可取的。因此就有了流,用流会很方便,可以帮我们避免这样的问题,调用其接口不用关心底层如何实现。

二. 什么是流(Stream)?

  流(Stream)是可读,可写或双工的。可以通过require('stream')加载流的基类,其中包括四类流, Readable 流、Writable 流、Duplex 流和Transform 流的基类。

  

  另外如果觉得上述四类基类流不能满足需求,可以编写自己的扩充类流。像我们Team现在正做的Node项目,就重写了Transform类以供使用。

  按照官方的API文档,步骤如下:

在您的子类中扩充适合的父类。(例如util.inherits(MyTransform, Transform); ) 在您的构造函数中调用父类的构造函数,以确保内部的机制被正确初始化。 实现一个或多个特定的方法,参见下面的细节。 

     

三. Readable流(可读流)介绍

   Readable(可读)流接口是对您正在读取的数据的来源的抽象。换言之,数据出自一个可读流。

   Readable 流有两种“模式”:流动模式暂停模式

   当处于流动模式时,数据由底层系统读出,并尽可能快地提供给您的程序;当处于暂停模式时,您必须明确地调用 stream.read() 来取出若干数据块。流默认处于暂停模式。

 

   A. 通过以下三种方法,可读流会被切换到流动模式

     1. 添加一个'data'事件处理器来监听数据。

     2. 调用 resume()方法来明确开启数据流。

  3. 调用 pipe()方法将数据发送到一个可写流(Writable)。

     之前我一直对pipe()方法有疑问,不清楚其用法。现在了解,当我们用pipe()为可读流指定了一个接受者(可写流)的时候,数据才会真正的被从底层系统读出,传递给可写流。

  

   B. 下面介绍Readable流有以下几种事件

     1. 'Readable'事件

     2. 'data'事件 - 数据正在传递时,触发该事件(以chunk数据块为对象)

     3. 'end'事件 - 数据传递完成后,会触发该事件。

     4. 'close'事件

     5. 'error'事件

     所有这些事件都可以在官方API文档中找到例子。

    C. 下面介绍Readable流很重要的一个方法,pipe()方法。

     该方法从可读流中拉取所有数据,并写入到所提供的目标(可写流)。该方法能自动控制流量以避免目标被快速读取的可读流所淹没。

     值得注意的是,默认情况下,当数据传送完毕,触发'end'事件时,会同时触发目标(可写流)的'end'事件,导致目标不再可写。

   举个简单的小例子,

 1 //http.js
2
3 var http = require('http');
4 var fs = require('fs');
5
6 http.createServer(function(req, res){
7 var stream = fs.createReadStream(__dirname + '/data.txt');
8 stream.pipe(res);
9 }).listen(3000);
10
11 console.log('now we are listening 3000 port');

data.txt文件内容如下:

    

     当执行此段代码后,用户访问http://127.0.0.1:3000/,会得到如下响应:

     

   此时,创建此Server后,用户访问请求过来,Server会创建一个可读流,当调用stream.pipe(res)为可读流指定目标后,可读流stream会开始从文件data.txt中读取数据,数据写入res(可写流)完毕后,自动调用res的end()方法,结束响应,可写流不再写入。

四. Writable流(可写流)介绍

   Writable(可写)流接口是对写入数据的目标的抽象。

   可写流重要的两个方法,

   1. write()方法

     该方法向底层系统写入数据,并在数据被处理完毕后调用所给的回调。

   2. end()方法

   当不再写入数据时,调用该方法,停止写入。在调用end()后,再调用write()方法会产生错误。

 

Node.js 【Stream之笔记】的更多相关文章

  1. 9、Node.js Stream(流)

    #########################################################################介绍Node.js Stream(流)Stream 是 ...

  2. Node.JS学习——学习笔记

    Node.JS--学习笔记 2020年02月23日11:52:01 我打算自学NodeJS-通过阅读NodeJS官网来完成. https://nodejs.org/dist/latest-v13.x/ ...

  3. Node.js stream 流学习

    由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...

  4. Node.js Stream(流)

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

  5. [Node.js] Stream all things!

    Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...

  6. Node.js API学习笔记(一)

    此文章已经发表于本人博客. Terminal(终端) 说起这个使用过linux系统的兄台一般都会知道的,本人理解:类似Putty这些ssh工具通过 软件来实现远程控制主机,对于我们使用者来说,它会显示 ...

  7. 《深入浅出Node.js》学习笔记(一)

    看了朴灵前辈的node.js系列文章,很开阔视野,虽然能力有限还是有很多不懂,但是还是希望能写下笔记,初步对node.js有点了解. 一.概念 Node.js不是JS应用.而是JS运行平台 Node. ...

  8. 24.Node.js Stream(流)

    转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...

  9. Node.js入门学习笔记(三)

    基于事件驱动的回调 这个问题不好回答,不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因.你可以花一点时间阅读一下Felix Geisendörfer的大作 Unders ...

  10. Node.js入门学习笔记(一)

    先来个最常见的"Hello World!". 打开你最喜欢的编辑器(我用的是Sublime Text),创建一个helloWorld.js的文件.我们要做的就是向stdout输出& ...

随机推荐

  1. 用scikit-learn实现朴素贝叶斯分类器 转

    原文:http://segmentfault.com/a/1190000002472791 朴素贝叶斯(Naive Bayes Classifier)是一种「天真」的算法(假定所有特征发生概率是独立的 ...

  2. 电商平台如何接入快递鸟电子面单API?

    快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流.物流金融.在线下单等服务,解决电商的物流管理模块和金融模块.现就对快递鸟电子面单API做基本描述, ...

  3. C#加密算法汇总(转载)http://www.cnblogs.com/zengxiangzhan/archive/2010/01/30/1659687.html

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 方法一:     //须添加对System.Web的引用    ...

  4. signed char、unsigned char

    什么是无符号char类型?与常见的char类型有何不同? 在c++中有三种不同的字符类型:char,signed char,unsigned char.如果要应用与文本字符,就使用不加限制的char类 ...

  5. Python性能测试

    python -m profile xxx.py > log.txt 打开log.txt查看,搜索你所关心的方法调用耗费的时间. profile的统计结果分为ncalls.tottime.per ...

  6. Java Concurrency - Callable & Future

    One of the advantages of the Executor framework is that you can run concurrent tasks that return a r ...

  7. HDOJ2028Lowest Common Multiple Plus

    Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  8. (转)如何把exe的flash还原成swf

    首先要准备一个16进制字节码编辑器,这里用的是UltraEdit,可以到这里下载它最新的破解版.现在我们开始我们的还原工作吧.1.用UltraEdit打开待还原的exe文件.你就会看到这个exe的字节 ...

  9. iOS - 文件与数据(File & Data)

    01 推出系统前的时间处理 --- 实现监听和处理程序退出事件的功能 //视图已经加载过时调用 - (void)viewDidLoad { [super viewDidLoad]; // Do any ...

  10. ViewTreeObserver类概述

    ViewTreeObserver 版本:Android 3.0 r1 结构 继承关系 public final class ViewTreeObserver extends Object java.l ...