Node.js[3] Buffer

JavaScript语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。
因此在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。

在Node.js中,Buffer类是随Node内核一起发布的核心库。
Buffer库为Node.js带来了一种存储原始数据的方法,可以让Node.js处理二进制数据,
每当需要在Node.js中处理I/O操作中移动的数据时,就有可能使用Buffer库。
原始数据存储在Buffer类的实例中。

一个Buffer类似于一个整数数组,但它对应于V8堆内存之外的一块原始内存。

创建Buffer实例

/**
 * tip: 请在命令行中测试
 * */

// 1.通过一个字符串来创建 Buffer 实例
var buffer1 = new Buffer('Hello World')

console.log('buffer1: ' + buffer1)

// 2.utf-8 是默认的编码方式,此外它同样支持以下编码:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"
var buffer2 = new Buffer('Hello World', 'base64')

console.log('buffer2: ' + buffer2)

// 3.创建长度为 10 字节的 Buffer 实例
var buffer3 = new Buffer(10)

console.log('buffer3: ' + buffer3.length)

// 4.
var buffer4 = new Buffer('12345678')

console.log('buffer4: ' + buffer4)

// 5.
var buffer5 = new Buffer([1, 2, 3, 4])

console.log('buffer5: ' + buffer5[1]) // 输出2

// 6.
var buffer6 = new Buffer([1, 2.33, 3.77, 4])

console.log('buffer6: ' + buffer6[1]) // 输出2

// 写入缓冲区
var buffer7 = new Buffer(7)

buffer7.write('12345678')

console.log('buffer7: ' + buffer7) // 输出1234567

写入缓冲区

如上面最后的一个例子

写入Node缓冲区的语法如下所示:
buffer.write(string, [offset], [length], [encoding])

/**
 * @param string - 写入缓冲区的字符串
 * @param offset - 缓冲区开始写入的索引值,默认为 0 
 * @param length - 写入的字节数,默认为 buffer.length
 * @param encoding - 使用的编码。默认为 'utf8'
 * @return 返回实际写入的大小
 * 如果 buffer 空间不足, 则只会写入部分字符串。
 */

从缓冲区读取数据

读取 Node 缓冲区数据的语法如下所示:
buffer.toString([encoding], [start], [end])

/**
 * @param encoding - 使用的编码。默认为 'utf8'
 * @param start - 指定开始读取的索引位置,默认为 0 
 * @param end - 结束位置,默认为缓冲区的末尾
 * @return 解码缓冲区数据并使用指定的编码返回字符串
 */

将 Buffer 转换为 JSON 对象

将 Node Buffer 转换为 JSON 对象的函数语法格式如下:
buffer.toJSON()

返回 JSON 对象

合并缓冲区

var buffer1 = new Buffer('冰糖雪梨加纯牛奶: ')
var buffer2 = new Buffer('SugarMilk')
var buffer3 = Buffer.concat([buffer1, buffer2])

console.log(buffer3.toString())

Node 缓冲区合并的语法如下所示:
Buffer.concat(list, [totalLength])

/**
 * @param list - 用于合并的 Buffer 对象数组
 * @param totalLength - 指定合并后Buffer对象的总长度 
 * @return 返回一个多个成员合并的新 Buffer 对象
 */

缓冲区比较

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

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

Node Buffer 比较的函数语法如下所示, 该方法在 Node.js v0.12.2 版本引入:
buffer.compare(otherBuffer)

/**
 * @param otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象
 * @return 返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同
 */

缓冲区拷贝

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('DEF');
buffer1.copy(buffer2, 1, 1, 3);
console.log(buffer1.toString()); // ABC
console.log(buffer2.toString()); // DBC

/**
 * 拷贝一个缓冲区
 * sourceBuffer(targetBuffer, targetStart, sourceStart, sourceEnd)
 * 被复制(替换)的buffer是targetBuffer, sourceBuffer没有发生改变
 *
 * @param targetStart targetBuffer要开始复制的位置
 * @param sourceStart-sourceEnd 提取从sourceBuffer的sourceStart到sourceEnd的部分作为要复制的内容
 * @return 无返回值
 */

缓冲区裁剪

var buffer1 = new Buffer('good')
var buffer2 = buffer1.slice(0, 2)

console.log(buffer2.toString()) // go

/**
 * 缓冲区裁剪
 * buffer.slice([start], [end])
 *
 * @param start - 数字, 可选, 默认: 0
 * @param end   - 数字, 可选, 默认: buffer.length
 * @return 返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切
 */

缓冲区长度

buffer.length

返回 Buffer 对象所占据的内存长度

其他方法

方法参考手册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值