美文网首页
nodeJs学习笔记(4) --- Stream

nodeJs学习笔记(4) --- Stream

作者: Jocelyn_Long | 来源:发表于2016-08-04 20:58 被阅读165次

    Buffer

    Buffer 用来创建专门存放二进制的一个缓存区。Buffer库为Node带来一种原始储存数据的方法,可以处理二进制数据。

    创建Buffer

    1.var buf = new Buffer(10);
    2.var buf = new Buffer([10, 20, 30, 40, 50]);
    3.var buf = new Buffer("www.runoob.com", "utf-8");
    

    utf-8 是默认的编码方式,此外它同样支持以下编码:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"。

    写入 Node 缓冲区的语法

    buf.write(string[, offset[, length]][, encoding]);
    

    从缓冲区读取数据

    buf.toString([encoding[, start[, end]]]);
    

    其他方法

    // 将buffer转成Json对象
    buf.toJSON();  
    //缓冲区合并                   
    Buffer.concat(list[, totalLength]); 
    // 缓冲区比较
    buf.compare(otherBuffer);    
    //拷贝缓冲区       
    buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]);
    //缓冲区裁剪
    buf.slice([start[, end]]);
    //缓冲区长度
    but.length;
    

    示例代码如下:

    var fs = require('fs');
    fs.readFile('logo.png', function(err, origin_buffer) {
        // 文件系统中传入的data就是二进制数据
        console.log(Buffer.isBuffer(origin_buffer));
        fs.writeFile('logo_buffer.jpg', origin_buffer, function(err) {
            if(err) console.log(err);
        })
        // 将Buffer转成'base64'编码的数据
        var base64Image = origin_buffer.toString('base64');
    
        console.log(base64Image);
    
        // 解码数据 转回二进制
        var decodeImage = new Buffer(base64Image, 'base64');
        console.log(Buffer.compare(origin_buffer, decodeImage));
    
        fs.writeFile('logo_buffer.jpg', decodeImage, function(err) {
            if(err) console.log(err);
        })
    })
    

    Stream

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

    Node.js,Stream 有四种流类型:
    Readable - 可读操作。
    Writable - 可写操作。
    Duplex - 可读可写操作.
    Transform - 操作被写入数据,然后读出结果。

    所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
    data - 当有数据可读时触发。
    end - 没有更多的数据可读时触发。
    error - 在接收和写入过程中发生错误时触发。
    finish - 所有数据已被写入到底层系统时触发。

    自己定制Stream

    var stream = require('stream');
    var util = require('util');
    
    // 自己定制的读入流构造函数
    function ReadStream() {
        stream.Readable.call(this);
    }
    // 复制可读流的属性
    util.inherits(ReadStream, stream.Readable);
    // 定义read方法
    
    ReadStream.prototype._read = function() {
        this.push('I');
        this.push('Love');
        this.push('Jocelyn\n');
        this.push(null);
    };
    // 自己定制的可写流构造函数
    function writStream() {
        stream.Writable.call(this);
        this._cache = new Buffer('');
    }
    // 复制可写流的属性
    util.inherits(writStream, stream.Writable);
    // 定义write方法
    writStream.prototype._write = function(chunk, encode, cb) {
        console.log(chunk.toString());
        cb();
    }
    
    function TransformStream() {
        stream.Transform.call(this);
    }
    
    util.inherits(TransformStream, stream.Transform);
    
    TransformStream.prototype._transform = function(chunk, encode, cb) {
        this.push(chunk);
        cb();
    }
    
    TransformStream.prototype._flush = function(cb) {
        this.push('Oh Yeah!');
        cb();
    }
    
    var rs = new ReadStream();
    var ws = new writStream();
    var ts = new TransformStream();
    
    rs.pipe(ts).pipe(ws);
    

    pipe

    上面例子有用到pipe(管道),其实就是说从一个容器流入另一个容器的管道, rs.pipe(ws) 管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

    相关文章

      网友评论

          本文标题:nodeJs学习笔记(4) --- Stream

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