Buffer是一个像Array的对象,主要用于操作字节
在Node进程启动时就已经加载Buffer,并将其放在全局对象上;无须通过require加载
Buffer对象类似于数组,元素为16进制的两位数,即0~255的数值
length
获取长度 、下标访问元素Buffer对象的内存分配不是在V8的堆内存中,而是在Node的C++层面实现内存申请
Node采用slab
分配机制,slab是一种动态内存管理机制,有三种状态:
指定大小的Buffer对象:new Buffer(size)
Node以8K为界限来区分Buffer是大对象还是小对象
var pool
function allocPool(){
pool = new SlowBuffer(Buffer.poolSize)
pool.used=0
}
this.parent = new SlowBuffer(this.length)
this.offset = 0
new Buffer(str,encoding)
buf.toString(encoding,start,end)
var fs = require('fs')
var rs = fs.createReadStream('./Node/input.txt')
var data = ''
// chunk对象即是Buffer对象
rs.on('data', function(chunk) {
data += chunk // 隐藏了toString方法
// data = data.toString()+chunk.toString()
})
rs.on('end', function() {
console.log(data)
})
setEncoding()
concat
方法在网络中,通常需要转换为Buffer,以二进制数据传输;提高字符串到Buffer的转化效率,可以提高网络吞吐量
fs.createReadStream()的工作方式是在内存中准备一段Buffer,然后fs.read()读取时逐步从磁盘中将字节复制到Buffer中。完成一次读取,则从这个Buffer中通过slice方法取出部分数据作为一个小Buffer对象,再通过data事件传递给调用方,如果Buffer用完则重新分配一个;如果还有剩余则继续使用