Node.js之Stream理解

2018-01-23  本文已影响38人  bo_bo_bo_la

在nodejs中可以通过fs模块读写文件,上篇文章页简单介绍了一下fs的用法

  1. fs.readFile(filename,fn)
    异步读取文件,filename是要读取的文件名称,如果是相对路径,则通过当前进程执行的路径来查找文件。
    fn是回调函数,有两个参数
    第一个参数err(如果没有报错,该值为null),进行操作时,应先判断err是否有值。
    第二个参数是代表文件内容的Buffer实例。
  2. 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应该还拥有如何合并等更复杂的应用方式。总之整体上符合如下特性:

上一篇下一篇

猜你喜欢

热点阅读