Node.js Stream(流)

1、流是什么?


815a8e07044157f6e85e849f75ec0d7.png

说明流 是一个装 数据的 东西,也可能是一个解析数据的东西,也可能是一个设备
流这个东西,可以读数据,可以写数据等
Node.js,Stream 有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream实例对象都是 EventEmitter 的实例,说明有on方法和emit方法,Stream实例对象常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。(如果不写end,就到不了finish事件)
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
2、可读流的例子

var fs = require("fs");
var data = '';
// 创建可读流
var readerStream = fs.createReadStream('input.txt');
// 设置编码为 utf8。
readerStream.setEncoding('UTF8');
// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});
readerStream.on('end',function(){
   console.log(data);
});
readerStream.on('error', function(err){
   console.log(err.stack);
});
console.log("程序执行完毕");

3、写入流的例子

var fs = require("fs");
var data = '菜鸟教程官网地址:www.runoob.com';
// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');
// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');
// 标记文件末尾
writerStream.end();
// 处理流事件 --> finish、error
writerStream.on('finish', function() {
    console.log("写入完成。");
});
console.log("程序执行完毕");

4、管道流
管道提供了一个输出流到输入流的机制。就是数据复制了

var fs = require("fs");
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');
// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');
// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);
console.log("程序执行完毕");

5、链式流
同.then的链式操作

var fs = require("fs");
var zlib = require('zlib');
// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));
console.log("文件压缩完成。");

6、读、写文件和用流读、写文件的区别
1、readFile(+对应的同步)方法是将要读取的文件内容完整读入缓存区,再从该缓存区中读取文件内容
writeFile(+对应的同步)方法是将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中

Node.js将文件内容视为一个整体,为其分配缓存区并且一次性将文件内容读取到缓存区中,在这个期间,Node.js将不能执行任何其他处理。所以当读写大文件的时候,有可能造成缓存区“爆仓”
read或readSync方法读取文件内容是不断地将文件中的一小块内容读入缓存区,最后从该缓存区中读取文件内容
write或writeSync方法写入内容时,node.js执行以下过程:1将需要写入的数据写入到一个内存缓存区;2待缓存区写满后再将缓存区中的内容写入到文件中;3重复执行步骤1和步骤2,知道数据全部写入文件为止
以上读写操作,node.js会将文件分成一块一块逐步操作,在读写文件过程中允许执行其他操作。
但有的时候我们并不关心整个文件的内容,而只关注从文件中读取到的某些数据,以及读取到数据时需要执行的处理,这时我们可以使用文件流来处理。
1、createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象
2、createWriteStream方法创建一个将流数据写入文件中的WriteStream对象
以上方法可以对读写文件的过程中进行监听,并定义相关的方法pause和resume暂停或恢复文件的读取操作,可以监听写入时缓存区数据是否已满或者是否已全部输出

image.png

你可能感兴趣的:(Node.js Stream(流))