Buffer
Buffer 函数是调用系统内存的方法,node环境输入 Buffer 得出
poolSixe : 内存载体的容量
isBuffer : 静态方法 ,判断对象是否是 Buffer 类型对象
compare : 判断两个 Buffer 对象的相对位置,一般来做按字符串的排序什么的
isEncoding : 判断node.js 是否支持某种编码
concat : 主要是将几个 Buffer 对象连接组成一个新的 Buffer对象,可以手动分配空间大小,如果空间不够,数据会被截断
byteLength : 用来获得指定编码下字符串所占的字符数
toString
toString 把 buffer 数据转成 xx 编码,默认不传是 uft-8 格式
示例
var buf = new Buffer('Hello');
var str = buf.toString('base64'); // 把 buffer 数据转成 base64 编码
str //就输出了 base64 格式的数据 'SGVsbG8='
//现在把 base64 转换还原回来
var buf2 = new Buffer('SGVsbG8=','base64'); //创建一个 buffer ,指定编码为 base64
var str = buf.toString('utf-8'); //不写也可以默认为 uft-8
str 就输出了 'Hello'
//其它转换也是同理
write
Buffer.write(string , offset=0 , length, encoding="utf-8")
write 是把数据写入 Buffer 中
第一个参数是要写入的字符串 ,
第二个参数是 字符串转换为字节数据后写入的位置
第三个参数是 字符串转换为字节数据后写入的长度
第4个参数为指定字符串写的的编码格式,默认为 utf-8
示例:buf.write
//new 一个
var buf = new Buffer('Hello 贤哥');
buf.length //打印出来 12 (注:12是字节数,一个汉字不是一个字节)
//向 buf 写入
buf.write('Hi 贤哥'); //打印出来 9
//打印出 buf 里存的东西
buf.toString() // 'Hi 贤哥哥' ???怎么会多一个哥
//再次打印 buf 长度
buf.length //打印出来 12 因为这个长度在初始化的时候就固定了
//打印出 'Hi 贤哥哥' 是因为写入的 'Hi 贤哥'的9个字节 把 'Hello 贤哥'的12个字节的前面9个给覆盖了,所后面的 12-9=3 个字节依然在,并没有变化
//向 buf 再次写入
buf.write(' ImoocImooc',2,11); // 写入 ' ImoocImooc' ,从第2个字节开始 ,写入字符串的长度为 11个字节
10 //打印出 10 的意思是写入了10个字节
buf.toString();
//打印出 'Hi ImoocImoo' 因为总字节只有12个 ,从第二个开始写入 就是 'Hi' 的后面,代码中写入的11个字节最后只写了10个进去,因为总空间只有12个,从第二个开始,空格也算一个,后面只有10个字节的空间了,所以最后那个 'c' 因为没有空间所以没有写进
copy
buffer.copy(target, tStart, sStart, sEnd=buffer.length)
copy 复制
第一个参数是用来指定复制的目标 buffer
第二个参数是目标 buffer 从第几个字节开始写,默认是 0
第三个参数是用来指定从原 buffer 里获取数据时的开始位置,默认是 0
第4个参数是指定从复制源对象里面获取数据的结束位置,默认是复制源的长度(就是复制到最后一个)
示例
var buf = new Buffer('Hello Imooc');
buf.length //创建一个 buffer 共11个字节
var buf2 = new Buffer(5); //创建另一个 buffer 共5个字节
buf.copy(buf2); //把 buf 复制到 buf2
buf2.toString(); //打印出来 'Hello',buf2的空间只是5个字节,所以只写入了前5个字节
buf.copy(buf2, 0, 6 ,11); //1、把 buf 复制到 buf2 ,2、从buf2第0个字开始写入 ,3、从buf的第6个字节开始复制 ,4、复制到第11个字节
buf2.toString(); //打印出来 'Imooc'
下面是一个实用的示例
该示例是 读取图片文件 ,再从新生成一个 和 用 buffer 把图片把读出来的数据转成 base64 编码,再重新生成一个图片
var fs = require('fs'); //引入文件模块
//读取当前文件里的 img.jpg 的文件数据,同时创建到 origin_buffer 对象中
fs.readFile('img.jpg', function(err, origin_buffer) {
//查看 origin_buffer 是不是一个 Buffer ,true
console.log(Buffer.isBuffer(origin_buffer))
//在当前文件里写入一个新文件, 名叫new.jpg , 内容是 origin_buffer
fs.writeFile('new_img.jpg', origin_buffer , function(err){
if(err){console.log(err)}
})
//复制一个图片
//1、把 origin_buffer 转成 base64 编码,origin_buffer 已经是一个 Buffer 了,所以可以直接用
var base64Image = origin_buffer.toString('base64');
console.log(base64Image);
//2、用 base64Image 创建一个 buffer,指定编码为 base64
var decodedImage = new Buffer(base64Image,'base64');
//可以比较一个 上面读取的 Buffer 和 转成 base64 后新创建的 Buffer 是不是一样的,结果是 true
console.log(Buffer.compare(origin_buffer, decodedImage));
//3、再用 new 的 buffer 写一个新文件
fs.writeFile('new_buffer_img.jpg', decodedImage , function(err){
if(err){console.log(err)}
})
//无论是直接读取生成的图片还是转成 base64 再生成的图片都是一模一样的
})