NodeJS学习笔记 (28)流操做-stream(ok)

模块概览

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

对于大部分的nodejs开发者来讲,日常并不会直接用到stream模块,只须要了解stream的运行机制便可(很是重要)。node

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

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

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

Stream分类

在nodejs中,有四种stream类型:gulp

  • Readable:用来读取数据,好比 fs.createReadStream()
  • Writable:用来写数据,好比 fs.createWriteStream()
  • Duplex:可读+可写,好比 net.Socket()
  • Transform:在读写的过程当中,能够对数据进行修改,好比 zlib.createDeflate()(数据压缩/解压)。

 

Readable Stream

如下都是nodejs中常见的Readable Stream,固然还有其余的,可自行查看文档。api

  • http.IncomingRequest
  • fs.createReadStream()
  • process.stdin
  • 其余

例子一:ide

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

例子二:ui

var fs = require('fs'); var readStream = fs.createReadStream('./sample.txt'); var content = ''; readStream.setEncoding('utf8'); readStream.on('data', function(chunk){ content += chunk; }); readStream.on('end', function(chunk){ // 文件读取完成,文件内容是 [你好,我是程序猿小卡] console.log('文件读取完成,文件内容是 [%s]', content); });

例子三:spa

这里使用了.pipe(dest),好处在于,若是源文件较大,对于下降内存占用有好处。code

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

注意:这里只是原封不动的将内容输出到控制台,因此实际上跟前两个例子有细微差别。能够稍作修改,达到上面一样的效果

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


Writable Stream

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

例子一:

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

例子二:

var fs = require('fs'); var content = 'hello world'; var filepath = './sample.txt'; var writeStram = fs.createWriteStream(filepath); writeStram.write(content); writeStram.end();


Duplex Stream

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

服务端代码:

var net = require('net'); var opt = { host: '127.0.0.1', port: '3000' }; var client = 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(); });

客户端代码:

var net = require('net'); var opt = { host: '127.0.0.1', port: '3000' }; var client = 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包括zlibcrypto,这里举个简单例子:文件的gzip压缩。

var fs = require('fs'); var zlib = require('zlib'); var gzip = zlib.createGzip(); var inFile = fs.createReadStream('./extra/fileForCompress.txt'); var out = fs.createWriteStream('./extra/fileForCompress.txt.gz'); inFile.pipe(gzip).pipe(out);

相关连接

https://nodejs.org/api/stream.html

相关文章
相关标签/搜索