Nodejs基础:stream模块入门介绍与使用
2017-05-24 09:45
746 查看
模块概览
nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。对于大部分的nodejs开发者来说,平常并不会直接用到stream模块,只需要了解stream的运行机制即可(非常重要)。
而对于想要实现自定义stream实例的开发者来说,就得好好研究stream的扩展API了,比如gulp的内部实现就大量用到了自定义的stream类型。
来个简单的例子镇楼,几行代码就实现了读取文件内容,并打印到控制台:
const fs = 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
其他
例子一:
var fs = require('fs'); fs.readFile('./sample.txt', 'utf8', function(err, content){ // 文件读取完成,文件内容是 [你好,我是程序猿小卡] console.log('文件读取完成,文件内容是 [%s]', content); });
例子二:
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); });
例子三:
这里使用了
.pipe(dest),好处在于,如果文件
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包括
zlib、
crypto,这里举个简单例子:文件的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相关文章推荐
- Nodejs基础:stream模块入门介绍与使用
- PHP循环函数使用介绍之PHP基础入门教程
- NodeJS基础:querystring 模块的使用
- nodejs基础 -- NPM 使用介绍
- nodejs 中模块使用的介绍
- PHP循环函数使用介绍之PHP基础入门教程
- 基础入门_Python-模块和包.深入Celery之使用队列以及优先级提高响应?
- 使用SteamVR Plugins插件为基础,来介绍Vive开发的入门,重点讲解设备的激活和控制接口
- Nodejs进阶:MD5入门介绍及crypto模块的应用
- Scala基础入门(十一 ) Vector集合容器使用介绍
- joi模块验证的介绍与使用——一种基于schema的nodejs的对象校验,简单易用
- 网站前端_EasyUI.基础入门.0001.jQuery EasyUI简单介绍与快速使用?
- PHP循环函数使用介绍之PHP基础入门教程
- linux系统学习:基础篇(系统介绍以及命令行的使用)快速入门linux系统
- PHP循环函数使用介绍之PHP基础入门教程
- NodeJS基础:readline模块的使用
- C#分析数据库结构,使用XSL模板自动生成代码 - 清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门 - CSDNBlog
- J2EE入门视频教程第二讲——IDE使用基础技巧
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)
- 模块包的使用介绍