Buffer
Buffer 用來創(chuàng)建專門存放二進制的一個緩存區(qū)。Buffer庫為Node帶來一種原始儲存數(shù)據(jù)的方法,可以處理二進制數(shù)據(jù)先朦。
創(chuàng)建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 緩沖區(qū)的語法
buf.write(string[, offset[, length]][, encoding]);
從緩沖區(qū)讀取數(shù)據(jù)
buf.toString([encoding[, start[, end]]]);
其他方法
// 將buffer轉(zhuǎn)成Json對象
buf.toJSON();
//緩沖區(qū)合并
Buffer.concat(list[, totalLength]);
// 緩沖區(qū)比較
buf.compare(otherBuffer);
//拷貝緩沖區(qū)
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]);
//緩沖區(qū)裁剪
buf.slice([start[, end]]);
//緩沖區(qū)長度
but.length;
示例代碼如下:
var fs = require('fs');
fs.readFile('logo.png', function(err, origin_buffer) {
// 文件系統(tǒng)中傳入的data就是二進制數(shù)據(jù)
console.log(Buffer.isBuffer(origin_buffer));
fs.writeFile('logo_buffer.jpg', origin_buffer, function(err) {
if(err) console.log(err);
})
// 將Buffer轉(zhuǎn)成'base64'編碼的數(shù)據(jù)
var base64Image = origin_buffer.toString('base64');
console.log(base64Image);
// 解碼數(shù)據(jù) 轉(zhuǎn)回二進制
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 中有很多對象實現(xiàn)了這個接口撵枢。例如民晒,對http 服務(wù)器發(fā)起請求的request 對象就是一個 Stream,還有stdout(標(biāo)準(zhǔn)輸出)诲侮。
Node.js镀虐,Stream 有四種流類型:
Readable - 可讀操作。
Writable - 可寫操作沟绪。
Duplex - 可讀可寫操作.
Transform - 操作被寫入數(shù)據(jù)刮便,然后讀出結(jié)果。
所有的 Stream 對象都是 EventEmitter 的實例绽慈。常用的事件有:
data - 當(dāng)有數(shù)據(jù)可讀時觸發(fā)恨旱。
end - 沒有更多的數(shù)據(jù)可讀時觸發(fā)辈毯。
error - 在接收和寫入過程中發(fā)生錯誤時觸發(fā)。
finish - 所有數(shù)據(jù)已被寫入到底層系統(tǒng)時觸發(fā)搜贤。
自己定制Stream
var stream = require('stream');
var util = require('util');
// 自己定制的讀入流構(gòu)造函數(shù)
function ReadStream() {
stream.Readable.call(this);
}
// 復(fù)制可讀流的屬性
util.inherits(ReadStream, stream.Readable);
// 定義read方法
ReadStream.prototype._read = function() {
this.push('I');
this.push('Love');
this.push('Jocelyn\n');
this.push(null);
};
// 自己定制的可寫流構(gòu)造函數(shù)
function writStream() {
stream.Writable.call(this);
this._cache = new Buffer('');
}
// 復(fù)制可寫流的屬性
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) 管道提供了一個輸出流到輸入流的機制仪芒。通常我們用于從一個流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個流中唁影。