Node.jsStream(流)Stream是一个抽象接口,Node中的很多对象都实现了这个接口。比如向http服务器发起请求的request对象是一个Stream,stdout(标准输出)。Node.js,Stream有四种流类型:Readable——可读操作。可写-可写操作。Duplex-读写操作。Transform-操作写入数据,然后读出结果。所有Stream对象都是EventEmitter的实例。常用的事件有:data——有数据读取时触发。end-当没有更多数据可读时触发。error-在接收和写入过程中发生错误时触发。finish-当所有数据都已写入底层系统时触发。本教程将向您介绍常见的流操作。从流中读取数据创建一个input.txt文件,内容如下:菜鸟教程官网地址:www.runoob.com创建一个main.js文件,代码如下:varfs=require("fs");var数据='';//创建可读流varreaderStream=fs.createReadStream('input.txt');//设置编码为utf8。readerStream.setEncoding('UTF8');//处理流事件-->data,end,anderrorreaderStream.on('data',function(chunk){data+=chunk;});readerStream.on('end',function(){console.log(data);});readerStream.on('error',function(err){console.log(err.stack);});console.log("Programexecutioncompleted");以上代码的执行结果如下:程序执行完毕后,写流创建main.js文件,代码如下:varfs=require("fs");vardata='菜鸟教程官网地址:www.runoob.com';//创建一个可写流,写入文件output.txtvarwriterStream=fs.createWriteStream('output.txt');//使用utf8编码写入数据writerStream.write(data,'UTF8');//标记文件结束writerStream.end();//处理流事件-->finish,errorwriterStream.on('finish',function(){console.log("写入完成。");});writerStream.on('error',function(err){console.log(err.stack);});console.log("程序执行完成");上面的程序会将data变量的数据写入到output.txt文件中。代码执行结果如下:$nodemain.js程序被执行并写入。查看output.txt文件内容:$catoutput.txt如上图,我们将文件比作一个装满水的桶,水就是文件中的内容。我们用一根管道(pipe)连接两个Buckets,让水从一个bucket流到另一个bucket,从而慢慢实现大文件的复制过程。在下面的示例中,我们读取一个文件的内容并将内容写入另一个文件。设置input.txt文件内容如下:菜鸟教程官网地址:www.runoob.com流水线操作示例创建main.js文件,代码如下:varfs=require("fs");//创建可读流varreaderStream=fs.createReadStream('input.txt');//创建可写流varwriterStream=fs.createWriteStream('output.txt');//流水线读写操作//Readinput.txt文件的内容,并将内容写入output.txt文件readerStream.pipe(writerStream);console.log("程序执行完成");代码执行结果如下:$nodemain.js程序执行完成查看output.txt文件内容:$catoutput.txt菜鸟教程官网地址:www.runoob.comPipelineStream操作实例ChainedStreamChained是一种通过将输出流连接到另一个流来创建多个流操作链的机制。链式流通常用于管道操作。接下来我们使用管道和链来压缩和解压缩文件。创建一个compress.js文件,代码如下:varfs=require("fs");varzlib=require('zlib');//将input.txt文件压缩为input.txt.gzfs.createReadStream('input.txt').pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));console.log("文件压缩完成。");代码执行结果如下:$nodecompress.js文件压缩完成。执行以上操作后,我们可以看到在当前目录下生成了input.txt的压缩文件input.txt.gz。接下来我们来解压文件,创建一个decompress.js文件,代码如下:varfs=require("fs");varzlib=require('zlib');//解压input.txt.gz文件作为输入console.log("文件解压完成。");code执行结果如下:$nodedecompress.js文件被解压。
