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

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)