Nodejs开发实战 : 第5节 stream模块入门介绍与使用

模块概览

nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。

对于大部分的nodejs开发者来说,平常并不会直接用到stream模块,只需要了解stream的运行机制即可(非常重要)。

而对于想要实现自定义stream实例的开发者来说,就得好好研究stream的扩展API了,比如gulp的内部实现就大量用到了自定义的stream类型。

来个简单的例子镇楼,几行代码就实现了读取文件内容,并打印到控制台:

constfs =require('fs');fs.createReadStream('./sample.txt').pipe(process.stdout);

Stream分类

在nodejs中,有四种stream类型:

Readable:用来读取数据,比如fs.createReadStream()。

Writable:用来写数据,比如fs.createWriteStream()。

Duplex:可读+可写,比如net.Socket()。

Transform:在读写的过程中,可以对数据进行修改,比如zlib.createDeflate()(数据压缩/解压)。

Readable Stream

以下都是nodejs中常见的Readable Stream,当然还有其他的,可自行查看文档。

http.IncomingRequest

fs.createReadStream()

process.stdin

其他

例子一:
varfs =require('fs');

fs.readFile('./sample.txt','utf8',function(err, content){// 文件读取完成,文件内容是 [你好,我是程序猿小卡]console.log('文件读取完成,文件内容是 [%s]', content);});

例子三:

这里使用了.pipe(dest),好处在于,如果文件

varfs =require('fs');fs.createReadStream('./sample.txt').pipe(process.stdout);

注意:这里只是原封不动的将内容输出到控制台,所以实际上跟前两个例子有细微差异。可以稍做修改,达到上面同样的效果

varfs =require('fs');varonEnd =function(){ process.stdout.write(']'); };varfileStream = fs.createReadStream('./sample.txt');fileStream.on('end', onEnd)fileStream.pipe(process.stdout);process.stdout.write('文件读取完成,文件内容是[');// 文件读取完成,文件内容是[你好,我是程序猿小卡]

Writable Stream

同样以写文件为例子,比如想将hello world写到sample.txt里。

例子一:

varfs =require('fs');varcontent ='hello world';varfilepath ='./sample.txt';fs.writeFile(filepath, content);

例子二:

varfs =require('fs');varcontent ='hello world';varfilepath ='./sample.txt';varwriteStram = fs.createWriteStream(filepath);writeStram.write(content);writeStram.end();

Duplex Stream

最常见的Duplex stream应该就是net.Socket实例了,在前面的文章里有接触过,这里就直接上代码了,这里包含服务端代码、客户端代码。

服务端代码:

varnet =require('net');varopt = {host:'127.0.0.1',port:'3000'};varclient = net.connect(opt,function(){    client.write('msg from client');// 可写});// 可读client.on('data',function(data){// server: msg from client [msg from client]console.log('client: got reply from server [%s]', data);    client.end();});

客户端代码:

varnet =require('net');varopt = {host:'127.0.0.1',port:'3000'};varclient = net.connect(opt,function(){    client.write('msg from client');// 可写});// 可读client.on('data',function(data){// lient: got reply from server [reply from server]console.log('client: got reply from server [%s]', data);    client.end();});

Transform Stream

Transform stream是Duplex stream的特例,也就是说,Transform stream也同时可读可写。跟Duplex stream的区别点在于,Transform stream的输出与输入是存在相关性的。

常见的Transform stream包括zlib、crypto,这里举个简单例子:文件的gzip压缩。

varfs =require('fs');varzlib =require('zlib');vargzip = zlib.createGzip();varinFile = fs.createReadStream('./extra/fileForCompress.txt');varout = fs.createWriteStream('./extra/fileForCompress.txt.gz');inFile.pipe(gzip).pipe(out);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容