什么是流呢?看字面意思,咱们可能会想起生活中的水流,电流。 可是流不是水也不是电,它只是描述水和电的流动;因此说流是抽象的。 在node.js中流是一个抽象接口,它不关心文件内容,只关注是否从文件中读到了数据,以及读到数据以后的处理,接着看:html
这里说了“全部的流都是EventEmitter的实例” 因此流继承了EventEmitter类。再来看流的类型:node
流中的数据有两种模式,二进制模式和对象模式.api
注意: 全部使用 Node.js API 建立的流对象都只能操做 strings 和 Buffer对象。可是,经过一些第三方流的实现,你依然可以处理其它类型的 JavaScript 值 (除了 null,它在流处理中有特殊意义)。 这些流被认为是工做在 “对象模式”(object mode)。 在建立流的实例时,能够经过 objectMode 选项使流的实例切换到对象模式。试图将已经存在的流切换到对象模式是不安全的。 说了那么多,如今开始写流:缓存
这里说说流程:安全
注意: 若是 Readable 切换到 flowing 模式,且没有消费者处理流中的数据,这些数据将会丢失。 好比, 调用了 readable.resume() 方法却没有监听 'data' 事件,或是取消了 'data' 事件监听,就有可能出现这种状况bash
在 paused 模式下,必须显式调用 stream.read() 方法来从流中读取数据片断。 在可读流'readable'事件里咱们就必须调用stream.read()方法。服务器
这里须要明白三点: 先建立一个1.txt socket
1.当我只要建立一个流 就会先把缓存区 填满,等待着你本身消费 2.当你消费小于 最高水位线时 会自动添加highWaterMark这么多数据 函数
3.若是当前缓存区被清空后会再次触发readable事件 ui
代表接下来没有数据要被写入 Writable 经过传入可选的 chunk 和 encoding 参数,能够在关闭流以前再写入一段数据 若是传入了可选的 callback 函数,它将做为 'finish' 事件的回调函数
drain事件的触发条件,必须知足两个条件: 1.当前缓存区满了,不能再写了 2.缓存区满了后被清空了,才会触发drain事件
咱们在开发中可能会遇到,要把可读流读出的数据须要放到可写流中去写入到文件里面,这时就能够用pipe方法
pipe方法的原理很简单,就是读一点,写一点,上代码
let fs = require('fs');
let ws = fs.createWriteStream('./2.txt');
let rs = fs.createReadStream('./1.txt');
rs.on('data', data => {
var flag = ws.write(data);
if(!flag)
rs.pause();
});
ws.on('drain', () => {
rs.resume();
});
rs.on('end', () => {
ws.end();
});
复制代码
let from = fs.createReadStream('./1.txt');
let to = fs.createWriteStream('./2.txt');
from.pipe(to);
复制代码
readable.unpipe()方法将以前经过stream.pipe()方法绑定的流分离
let fs = require('fs');
let from = fs.createReadStream('./1.txt');
let to = fs.createWriteStream('./2.txt');
from.pipe(to);
setTimeout(() => {
console.log('关闭向2.txt的写入');
from.unpipe(writable);
console.log('手动关闭可写流');
to.end();
}, 1000);
复制代码
咱们能够引入stream模块,想实现什么流 就继承这个流。
为了实现可写流,咱们须要使用流模块中的Writable构造函数。 咱们只需给Writable构造函数传递一些选项并建立一个对象。惟一须要的选项是write函数,该函数揭露数据块要往哪里写。
有了双工流,咱们能够在同一个对象上同时实现可读和可写,就好像同时继承这两个接口。 重要的是双工流的可读性和可写性操做彻底独立于彼此。 net中的Socket就是一个duplex双工流
说到这里,我想你们应该大体了解了node.js里面的流。 以前说过在node里流仍是很重要的,http里的request和response都是流。 在下一篇文章我会写一个readStream和writeStream的简单实现。 本人水平有限,有错误的地方但愿指出。