美文网首页
Node.js之Stream理解

Node.js之Stream理解

作者: bo_bo_bo_la | 来源:发表于2018-01-23 20:26 被阅读38次

    在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应该还拥有如何合并等更复杂的应用方式。总之整体上符合如下特性:

    • Stream分为readable、writeable
    • Stream通过pipe方法控制流向
    • httpServer和httpClient和flie system 和 process.stdin\out\err通常可以作为Stream
    • Stream可以被on转化为普通的变量,普通变量可以被write转换成Stream
    • Stream自身可以被拆分、合并、过滤

    相关文章

      网友评论

          本文标题:Node.js之Stream理解

          本文链接:https://www.haomeiwen.com/subject/ableaxtx.html