Node.js Buffer(缓冲区)–(一)


摘要:
下文讲述Node.js中的buffer缓冲区的主要用法,如下所示:



Node.js Buffer由来

在javascript中,只有object、number、string、boolean、null、undefined 六种类型,
作为服务端语言,缺少”二进制数据类型”。
在服务端处理各种数据时,常见的文件流,都是采用二进制数据类型,所以Node.js提供了Buffer缓冲类,用于存放二进制数据流。


Node.js Buffer 简介说明

在Node.js框架中,buffer类为系统提供的基础类,buffer类可以处理二进制数据,当我们涉及IO操作时,我们会使用buffer类,下文将通过举例的方式分享buffer类的使用方法,如下所示:


1.创建一个Buffer类

 ---创建一个80字节的Buffer类
 var a = new Buffer(80)

2.通过一个已存在的数组创建Buffer

  var b = new Buffer([1,2,3,4,5,6,7,8]);

3.使用字符串创建一个buffer实例

  var c = new Buffer("www.maomao365.com","ascii");
  ---buffer支持以下编码模式,缺省值为utf-8
  ---"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"

4.向buffer实例中写入数据

  [buffer实例].write(string[, offset[, length]][, encoding]);

----参数说明:
    string - 缓冲区写入的字符串信息
    offset - 写入的起始位置,默认为 0 。
    length - 写入的字节长度,缺省值为 buffer.length
    encoding - 写入时,使用的编码方式,缺省值为 'utf8' 

----返回值说明
    返回实际写入Buffer中的大小,当Buffer空间不足时,只写入可容纳的字符串信息 

-----例:
 var a = new Buffer(120);
 var writeLength = a.write("www.maomao365.com this is node.js blog");

console.log("写入buffer的字节长度 : "+ writeLength);

5.从buffer实例中读取数据

 
[buffer实例].toString([encoding[,start[,end]]])
 
-----参数说明-------
encoding:
  读取文件的编码方式,缺省值为:utf-8 
start:
  文件开始读取的位置
end:
  文件结束读取的位置

-----返回值说明-------
解码缓冲区数据并使用指定的编码返回字符串

 

-----例:--------
var a  = new Buffer(30);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 30;
}

console.log( buf.toString('ascii'));         
console.log( buf.toString('ascii',0,5));   
console.log( buf.toString('utf8',0,5));    
console.log( buf.toString(undefined,0,5));  
  

6.将字符串转换为JSON对象

  buffer实例.toJSON();
  ---返回值说明---
  返回JSON对象

  -------例-------
var a = new Buffer('www.maomao365.com');
var aToJSON = buf.toJSON(a);

console.log(aToJSON);

7.buffer缓冲区相加

  Buffer.concat(list[,totalLength])
----参数说明----- 
list:
 待合并的Buffer对象数组列表
totalLength:
  合并后Buffer对象的总长度

----返回值说明----- 
   返回组合后的新Buffer对象 

--------例:--------
var a = new Buffer('Node.js教程');
var b = new Buffer('www.maomao365.com');
var newBuffer = Buffer.concat([a,b]);
console.log("buffer3: " + newBuffer.toString());

8.Buffer前后比较

 
buffer1.compare(buffer2);
----参数说明-----
buffer2
同buffer1对象比较。
----返回值说明----
返回一个数字,小于零代表buffer1在buffer2之前

返回一个数字,等于零代表buffer1 同 buffer2相同
 
-----例:-------

var buffer1 = new Buffer('maomao365');
var buffer2 = new Buffer('maoamao365.com');
var r = buffer1.compare(buffer2);

if(r < 0) {
   console.log(buffer1 + " 在 " + buffer2 + "之前");
}
if(r == 0){
   console.log(buffer1 + " 与 " + buffer2 + "相同");
}

if(r > 0){
   console.log(buffer1 + " 在 " + buffer2 + "之后");
}

9.Buffer缓冲区复制方法

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

-----参数说明------ 
 targetBuffer:
   待复制的buffer对象
targetStart:
  开始位置,数值类型,缺省值为0 
sourceStart:
   开始位置,数值类型,缺省值为0
sourceEnd:
   结束位置,缺省值为buffer.length 

-----返回值说明------ 
   此方法无返回值

---例:
var buffer1 = new Buffer('maomao365.com');
// 拷贝一个缓冲区
var buffer2 = new Buffer(6);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());
---输出信息-----
buffer2 content: maomao

10.buffer缓冲区剪切

 buf.slice([start[, end]])
----参数说明---------
start
  开始位置,数值类型,缺省值为0 
end
   开始位置,数值类型,缺省值为0

-----返回值说明------
返回一个由buf剪切的新的buffer对象 

10.Buffer长度计算方法

  buf.length
  ---返回值说明---
  返回buf实例在内存中占用的长度

  ---例:
  var a = new Buffer("www.maomao365.com");
  console.log("a length:"+a.length);