Node.js 【Stream之笔记】
从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之笔记】的更多相关文章
- 9、Node.js Stream(流)
#########################################################################介绍Node.js Stream(流)Stream 是 ...
- Node.JS学习——学习笔记
Node.JS--学习笔记 2020年02月23日11:52:01 我打算自学NodeJS-通过阅读NodeJS官网来完成. https://nodejs.org/dist/latest-v13.x/ ...
- Node.js stream 流学习
由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...
- Node.js Stream(流)
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...
- [Node.js] Stream all things!
Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...
- Node.js API学习笔记(一)
此文章已经发表于本人博客. Terminal(终端) 说起这个使用过linux系统的兄台一般都会知道的,本人理解:类似Putty这些ssh工具通过 软件来实现远程控制主机,对于我们使用者来说,它会显示 ...
- 《深入浅出Node.js》学习笔记(一)
看了朴灵前辈的node.js系列文章,很开阔视野,虽然能力有限还是有很多不懂,但是还是希望能写下笔记,初步对node.js有点了解. 一.概念 Node.js不是JS应用.而是JS运行平台 Node. ...
- 24.Node.js Stream(流)
转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...
- Node.js入门学习笔记(三)
基于事件驱动的回调 这个问题不好回答,不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因.你可以花一点时间阅读一下Felix Geisendörfer的大作 Unders ...
- Node.js入门学习笔记(一)
先来个最常见的"Hello World!". 打开你最喜欢的编辑器(我用的是Sublime Text),创建一个helloWorld.js的文件.我们要做的就是向stdout输出& ...
随机推荐
- Helpers\Password
Helpers\Password The password class uses php 5 password_ functions. To create a hash of a password, ...
- yum.pid 已被锁定
刚刚打开虚拟机,然后打算安装sharutils 工具在安装sharutils 工具的时候 终端提示 “/var/run/yum.pid 已被锁定,PID 为 1610 的另一个程序正在运行.” r ...
- laravel controller:make
php artisan make:controller DIR/XXXController
- c语言指针函数与函数指针
例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...
- java中关于json传图片的方法
一般来说传图片可以以流的形式来传输,即便是用json传输,一般也都是传一个地址,而图片都存在服务器上,然后顺着地址发送请求下载图片. 但是这次公司的项目中,图片是存在oracle数据库中的blob字段 ...
- CCTableView的使用和注意事项
#include "cocos-ext.h" using namespace cocos2d::extension; class TableViewTestLayer: publi ...
- React Redux Sever Rendering实战
# React Redux Sever Rendering(Isomorphic JavaScript) ![React Redux Sever Rendering(Isomorphic)入门](ht ...
- Mysql:表的操作
1.列的添加 2.列的删除 删除多列只需在DROP id 后加, DROP column_name; 3.显示表属性 4.设置默认值 5.删除默认值
- ceph运维命令合集
一.集群 1.启动一个ceph进程 启动mon进程 [root@ceph-adm ~]#203.109 service ceph start mon.ceph-mon1 启动msd进程 [root@c ...
- 虚拟机中Ubuntu设置固定IP方法
--2013年7月29日20:39:16 场景:在搭建hadoop分布式系统的时候,每次重启节点,节点对应的ip发生变化,现在需要将每个节点绑固定的ip --原理: 设置节点用的网卡->绑定ip ...