Node.js之Stream理解
2018-01-23 本文已影响38人
bo_bo_bo_la
在nodejs中可以通过fs模块读写文件,上篇文章页简单介绍了一下fs的用法
- fs.readFile(filename,fn)
异步读取文件,filename是要读取的文件名称,如果是相对路径,则通过当前进程执行的路径来查找文件。
fn是回调函数,有两个参数
第一个参数err(如果没有报错,该值为null),进行操作时,应先判断err是否有值。
第二个参数是代表文件内容的Buffer实例。 - fs.writeFile(filename,content,[,encode],fn)
异步写入文件,content是要写入的内容,encode为编码格式,默认是utf-8。
既然有异步,自然也会有同步,在每个异步函数后面加上Sync。
上面几个接口,无论是异步是同步,都是等文件读取完成才进行操作的。
如果操作的文件是一些小文件,这种操作是没有问题。
但是在服务器端,文件体积一般很大,用这种方式效率低,导致线程阻塞,甚至会因为内存不足而崩溃。
所以就有了stream
nodejs中Stream是EventEmitter的实现,你可以理解为程序后台打开了一个文件(不占用主线程)
程序会一点点的读取(写入)文件
var fs = require('fs');
// 创建一个可读流
var readStream = fs.createReadStream('/path/to/source');
var writeStream = fs.createWriteStream('/path/to/dest');
readStream.on('data', function(chunk){
// 可读流收到data事件时,将内容写入到可写流
writeStream.write(chunk);
});
readStream.on('end', function(){
// 当可读流读取完成,会发出end事件,这时我们要把可写流关闭
writeStream.end();
});
当调用fs.createReadStream时,相当于创建一个文件读取流。
可以通过监听Data事件,来读取的部分数据,来进行一些操作。也可以用pipe的写法
var http = require("http");
var url = require("url");
var fs = require("fs");
var server = http.createServer(function (req,res) {
var pathname = url.parse(req.url,true).pathname;
if(pathname == "/" || pathname == "/index"){
var rs = fs.createReadStream("./index.html");
rs.pipe(res);
}else if(pathname == "/goods"){
var rs = fs.createReadStream("./goods.html");
rs.pipe(res);
}else if(pathname != "/favicon.ico"){
var rs = fs.createReadStream("."+pathname);
rs.pipe(res);
}
})
server.listen(8787);
总结
通过上述例子,可以知道stream应该还拥有如何合并等更复杂的应用方式。总之整体上符合如下特性:
- Stream分为readable、writeable
- Stream通过pipe方法控制流向
- httpServer和httpClient和flie system 和 process.stdin\out\err通常可以作为Stream
- Stream可以被on转化为普通的变量,普通变量可以被write转换成Stream
- Stream自身可以被拆分、合并、过滤