js 读取mid文件_Node.js实战10:“流”是Node.js最强大的功能之一

流是Nodejs的高级应用,掌握流的使用,才能真正胜任NodeJS开发。

Nodejs中,流是基于事件的API,用于管理和处理数据,而且效率很好!

什么是流?

流是一个抽象接口,Node 中有很多对象实现了这个接口。

例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)等。

流的四种类型

dable - 可读操作。

Writable - 可写操作。

Duplex - 可读可写操作.

Transform - 操作被写入数据,然后读出结果。

流的事件

所有的流对象都是 EventEmitter 的实例,流常用的事件有:

data - 当有数据可读时触发。

end - 没有更多的数据可读时触发。

error - 在接收和写入过程中发生错误时触发。

finish - 所有数据已被写入到底层系统时触发。

什么时候使用流?

举例说明:

1、当使用fs.readFileSync同步读取一个文件的时候,所有的数据会被全部读到内存中,这个操作过程中程序会被阻塞。

2、如果使用fs.readFile,由于它是异步方法,那么阻塞不会发生,但数据仍会被全部读到内存中再处理。

当处理大文件压缩、媒体文件等的时候,无疑会很吃力。那么这时,就是使用流的时候了。

3、流会将分批次的读取适量的内容到缓存区进行操作,而不是一次性读取所有目标内容。

这样,程序对内存的使用量会极大减少、执行性能会提升很多:

ac1d9aa50d19828d984e942662a89bb1.png

举例说明,使用流的优势

先使用node内置的核心模块http实现一个简单的静态web服务器:

c86d54f1e2b7f15d8242d3aab469cc94.png
var http = require("http");var fs = require("fs");http.createServer(function(req,res){ fs.readFile(__dirname + "/test10.js",function(err,data){ if(err){ res.statusCode = 500; res.end(String(err)); }else{ res.end(data); } })}).listen(8000);

这段代码使用非阻塞的fs.readfile的方法。

当被访问时,读取文件内容(代码中读取的是本举程代码)并发送给访问者。

测试访问,效果:

3341598a6c51fa783408b335b64dbf04.png

可能说,功能并无问题。但如果被读取的文件test10.js文件非常大呢。就会有效率问题。

这时,可以改用流的方式:

注意图中标识出的内容,是修改的内容:使用流的方式读取,通过管道(pipe)传给res。

6eb10850488a4f2ddbe56a6549c3fccc.png
var http = require("http");var fs = require("fs");http.createServer(function(req,res){  fs.createReadStream(__dirname+"/test10.js").pipe(res);}).listen(8000);
d61706d771a75f2107581bebea9a83c5.png

执行效果一样,但对内存的使用得到优化,性能得到提升。

同时,代码也更简洁。

流不仅高效优雅,扩展性也更强。比如对上面的代码稍做改动,就可以实现gzip压缩传输数据,可以使网页打开更快。

780434e29dfb4eab5a63fc92bbe43948.png
var http = require("http");var fs = require("fs");var zlib = require("zlib");http.createServer(function(req,res){ res.writeHead(200,{"content-encoding":"gzip"}); fs.createReadStream(__dirname+"/test10.js").pipe( zlib.createGzip() ).pipe(res);}).listen(8000);
db7cb612167b2d9d76dc9fba55dea973.png

从浏览器信息中可以看到,内容已启用gzip压缩。

更多本系列文章:

Node.js实战9:用EventEmitter触发和响应事件

Node.js实战8:可用于压缩、加密的zlib

Node.js实战7:你了解buffer吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值