nodejs中大量的api与流有关,曾经看到公司的一些大神的node代码,实现一个接口只须要pipe一下另外一个java接口就能够了。简单的一行代码实在让人困惑。做为小白的本身一脸懵逼却又不敢问,由于根本不知道从何问起。如今终于经过学习,也能对流说出个123,但愿和你们共同交流。html
流分为缓冲模式和对象模式,缓冲模式只能处理buffer或字符串,对象模式能够处理js对象。流又分为四种类型:可读流、可写流、双工流和转换流。后两种实际上是对可读和可写流的应用。因此我想先聊聊可读流和可写流。java
可读流有两种模式,并随时能够转换,咱们能够经过监听可读流的事件来操做它。node
两种模式(引用自node中文网的描述):
一、流动模式:可读流自动读取数据,经过EventEmitter接口的事件尽快将数据提供给应用。
二、暂停模式:必须显式调用stream.read()方法来从流中读取数据片断。api
暂停模式切换到流动模式的api有:
一、监听“data”事件
二、调用 stream.resume()方法
三、调用 stream.pipe()方法将数据发送到可写流
缓存
流动模式切换到暂停模式的api有:
一、若是不存在管道目标,调用stream.pause()方法
二、若是存在管道目标,调用 stream.unpipe()并取消'data'事件监听
bash
可读流事件:'data','readable','error','close','end'函数
可写流相对较为简单,咱们也能够经过监听它的事件来操做它。学习
可写流事件: 'close','drain','error','finish','pipe','unpipe'ui
我以一个简单的例子描述一个流最多见的场景,谈谈对这个过程的理解。例子就是:我要读取一个文件,而后把它的内容写到另外一个文件(固然是用“流”的api,而不是用‘fs’模块的api)。 spa
那么这张图对应到代码是什么样的呢:
let fs = require('fs');
//建立可读可写流
let rs = fs.createReadStream('./1.txt');
let ws = fs.createWriteStream('./2.txt');
//监听‘data’事件,开启流动模式
rs.on('data',function (data) {
//对应图中的可写流true和false
let flag = ws.write(data);
if(!flag){
//若是可写流返回false,咱们应当中止读取,以免消耗过多内存
rs.pause();
}
});
//对应图中的drain事件
ws.on('drain',function () {
//从新开启流动模式
rs.resume();
});
//使用可读流的暂停模式
function read() {
let data = rs.read()
let flag = ws.write(data);
if(flag){
read()
}
}
rs.on('readable',function(){
read()
})
ws.on('drain',function () {
read()
});
复制代码
可读和可写流的用法和api还有不少,这里只是简单的梳理了一下基本过程,若是有描述不许确的地方还请你们在评论区多指正。