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) 管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
网友评论