9、Node.js Stream(流)
#########################################################################介绍
Node.js Stream(流)
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。
Node.js,Stream 有四种流类型:
• Readable - 可读操作。
• Writable - 可写操作。
• Duplex - 可读可写操作.
• Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
• data - 当有数据可读时触发。
• end - 没有更多的数据可读时触发。
• error - 在接收和写入过程中发生错误时触发。
• finish - 所有数据已被写入到底层系统时触发。
#############################################################################
从流中读取数据
read_source.txt:love A
####main.js
var fs = require('fs'); var data = ''; // 创建可读流 var readStream = fs.createReadStream('read_source.txt'); // 设置编码为 utf8 readStream.setEncoding('UTF8'); // 处理流事件 --> data, end, and error readStream.on('data', function (chunk) { data += chunk; }); readStream.on('end', function () { console.log(data); }); readStream.on('error', function (err) { console.log(err.stack) }); console.log('程序执行完毕');
执行结果:
程序执行完毕
love A
#############################################################################
写入流
var fs = require('fs'); var data = 'love A'; // 创建写入流,写入到文件 output.txt 中 var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 编码写入数据 writerStream.write(data, 'utf8'); // 标记文件末尾 writerStream.end(); // 处理流事件 --> finish and error writerStream.on('finish', function () { console.log('写入完毕'); }); writerStream.on('error', function (err) { console.log(err.stack); }); console.log('程序执行完毕');
执行结果:
程序执行完毕
写入完毕
###注意
创建写入流的时候,文件存在会覆盖原来文件。后面的例子也一样,是文件的部分,现在还没有学到那里,如果需要如何追加内容,按照Java的思路查找api文档
#############################################################################
管道流
管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
如上面的图片所示,我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。
以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。
####实例
var fs = require('fs'); var readStream = fs.createReadStream('read_source.txt'); var writerStream = fs.createWriteStream('output2.txt'); // 管道读写操作 // 读取 read_source.txt 文件内容,并将内容写入到 output2.txt中 readStream.pipe(writerStream); console.log('程序执行完毕');
#############################################################################
链式流
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
接下来我们就是用管道和链式来压缩和解压文件。
###压缩
创建 compress.js 文件, 代码如下:
var fs = require('fs'); var zlib = require('zlib'); // 压缩 read_source.txt 成 read_source.txt.gz var readStream = fs.createReadStream('read_source.txt'); var gzip = zlib.createGzip(); var writeStream = fs.createWriteStream('read_source.txt.gz'); readStream.pipe(gzip); gzip.pipe(writeStream); console.log('文件压缩完成');
###解压
执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:
var fs = require('fs'); var zlib = require('zlib'); // 解压 read_source.txt.gz 成 depress.txt var readStream = fs.createReadStream('read_source.txt.gz'); var gunzip = zlib.createGunzip(); var writeStream = fs.createWriteStream('depress.txt'); readStream.pipe(gunzip); gunzip.pipe(writeStream); console.log('文件解压完成');
内容来自:http://www.runoob.com/nodejs/nodejs-stream.html +我的学习理解