1. 流的概念
流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface)。 stream 模块提供了基础的 API 。使用这些 API 可以很容易地来构建实现流接口的对象。
stream模块可以通过以下方式引入:
const stream = require('stream');
2.流的类型
Node.js中有四种基本的流类型
- Readable - 可读的流(例如fs.createReadStream()).
- Writable - 可写的流(例如fs.createWriteStream()).
- Duplex - 可读写的流 (例如net.Socket).
- Transform - 再读写过程中可以修改和变换数据的Duplex流(例如zlib.createDeflate()).
3.流中的数据有两种模式,二进制模式和对象模式
所有使用Node.js API 创建的对象都只能操作strings和Buffer(或 Uint8Array) 对象,但是通过第三方流的实现,你依然能够处理其它类型的Javascript值,这些流被认为是工作在“对象模式”
4.缓冲
Writable和Readable流都会将数据存储到内部的缓冲器(buffer)中。这些缓冲器可以通过相应的writable._writableState.getBuffer()或readable._readable.buffer来获取 缓冲器的大小取决于传递给流构造函数的highWaterMark选项。对于普通的流,highWaterMark选项制定了总共的字节数。对于工作在对象模式的流,highWaterMark指定流对象的总数
5.可读流创建及监听事件
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
- data:当数据可读时触发
- end: 没有更多数据可读时触发
- error: 在接收和写入过程中发生错误时触发
- finish: 所有数据已被写入到底层系统时触发
下面写一个例子,从流中读取数据
var fs = require('fs');
var data = '';
//创建可读流
var readerStream = fs.createReadStream('a.txt');
//设置编码为utf8
readerStream.setEncoding('UTF8');
//处理流事件 data,end,error
readerStream.on('data',function(chunk){
data += chunk;
});
readerStream.on('end',function(){
console.log(data);
});
readerStream.on('error', function(){
console.log(err.stack);
})
console.log('程序执行完毕')
运行结果
程序执行完毕
hello world!
写入流-例子
var fs = require('fs');
var data = '学习node stream';
//创建一个可写流
var wirteStream = fs.createWriteStream('b.txt');
//使用utf8编码写入数据
wirteStream.write(data,'UTF8');
//标记文件末尾
wirteStream.end();
//处理流事件 data,end, error,finish
wirteStream.on('finish',function(){
console.log('写入完成');
})
wirteStream.on('error', function(err){
console.log(err.stack)
})
console.log('程序执行完毕');
运行结果
程序执行完毕
写入完成
打开b.txt查看,内容为
学习node stream
(未完待续)