当前位置: 首页 > 后端技术 > Node.js

Nodejs基础:stream模块入门介绍与使用

时间:2023-04-03 16:10:25 Node.js

Nodejs基础:stream模块介绍及使用欢迎加入群交流,群号197339705。对于大多数nodejs开发者来说,他们通常不会直接使用stream模块,只需要了解stream的运行机制即可(很重要)。对于想要实现自定义流实例的开发者来说,不得不去研究stream的扩展API。例如,gulp的内部实现使用了大量的自定义流类型。举个简单的例子,几行代码就可以读取文件内容并打印到控制台:constfs=require('fs');fs.createReadStream('./sample.txt').pipe(过程.stdout);Stream在nodejs中被分类,有四种流类型:Readable:用于读取数据,如fs.createReadStream()。Writable:用于写入数据,如fs.createWriteStream()。双工:可读+可写,如net.Socket()。Transform:在读写过程中,可以修改数据,比如zlib.createDeflate()(数据压缩/解压)。ReadableStream以下是nodejs中常见的ReadableStreams,当然还有其他的,大家可以自行查看文档。http.IncomingRequestfs.createReadStream()process.stdin其他示例1:varfs=require('fs');fs.readFile('./sample.txt','utf8',function(err,content){//文件读取完成,文件内容为【你好,我是程序员小卡】console.log('The文件读取完成,文件内容为[%s]',content);});示例2:varfs=require('fs');varreadStream=fs.createReadStream('./sample.txt');varcontent='';readStream.setEncoding('utf8');readStream.on('data',function(chunk){content+=chunk;});readStream.on('end',function(chunk){//文件读取完成,文件内容为【你好,我是程序员小卡】console.log('文件读取完成,文件内容为[%s]',内容);});例3:这里使用.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('文件读取完毕,filecontentis[');//读取文件,文件内容为[你好,我是程序员小卡]WritableStream也以写入文件为例,比如你要将helloworld写入sample。TXT。示例1:varfs=require('fs');varcontent='你好世界';varfilepath='./sample.txt';fs.writeFile(文件路径,内容);示例2:varfs=require('fs');varcontent='helloworld';varfilepath='./sample.txt';varwriteStram=fs.createWriteStream(filepath);writeStram.write(content);writeStram.end();DuplexStream是最常见的Duplexstream应该是net.Socket实例。我在之前的文章中已经接触过了。这里直接上代码,包括服务端代码和客户端代码。服务器代码:varnet=require('net');varopt={host:'127.0.0.1',port:'3000'};varclient=net.connect(opt,function(){client.write('msgfromclient');//可写});//可读client.on('data',function(data){//server:msgfromclient[msgfromclient]console.log('client:gotreplyfromserver[%s]',data);client.end();});客户端代码:varnet=require('net');varopt={host:'127.0.0.1',port:'3000'};varclient=net.connect(opt,function(){client.write('msgfromclient');//可写});//可读client.on('data',function(data){//client:从服务器得到回复[replyfromserver]console.log('client:从服务器[%s]得到回复',data);client.end();});TransformStreamTransform流是Duplex流的一种特例,即Transform流也可以同时读写。与Duplexstream的区别在于Transformstream的输出和输入是相关的。常见的转换流包括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);相关链接https://nodejs.org/api/stream...