为什么应该使用流?
在node中,i/o都是异步的,所以在和硬盘以及网络的交互过程中设计到传递回调函数的过程中。你之前可能会写出这样的代码:
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
fs.readFile(__dirname + '/data.txt',function(err,data){
res.end(data);
});
});
server.listen(8000);
上面的这段代码并没有什么问题,但是在每次请求的时候,都会把整个data.txt文件读入到内存中,然后再把结果返回给客户端。如果文件非常大,消耗内存,同时等待文件读入内存,用户体验不好。
使用流对象操作文件。
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
var stream = fs.createReadStream(__dirname + '/data.txt');
stream.pipe(res);
});
pipe()方法会自动监听data和end事件。上面的代码会将文件每一个小段数据都源源不断的发送到客户端。除此之外,pipe()方法还可以自动控制后台压力,以便客户端连接缓慢的时候node可以将尽可能少的缓存放到内存中。
使用流模块压缩数据
var http = require('http');
var fs = require('fs');
var oppressor = require('oppressor');
var server = http.createServer(function(req,res){
var stream = fs.createReadStream(__dirname + '/data.txt');
stream.pipe(oppressor(req)).pipe(res);
});
server.listen(8000);