NodeJs学习之路(3)

本文主要探讨Node.js中的Buffer类,它是处理二进制数据流的关键。在ES6之前,JavaScript缺少这类功能,而Buffer提供了优化的Uint8Array实现。Buffer实例在V8堆外固定大小分配内存,创建后无法调整。作为全局变量,无需require导入。文章将介绍Buffer的属性和方法。

Buffer

官方文档的描述:

在 ECMAScript 2015 (ES6) 引入 TypedArray 之前,JavaScript语言没有读取或操作二进制数据流的机制。 Buffer 类被引入作为 Node.js API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。

TypedArray 现已被添加进 ES6 中,Buffer 类以一种更优化、更适合 Node.js 用例的方式实现了 Uint8Array
API。

Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的、且在 V8 堆外分配物理内存。 Buffer
的大小在被创建时确定,且无法调整。

Buffer 类在 Node.js 中是一个全局变量,因此无需使用 require(‘buffer’).Buffer。

例子:

// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);

// 创建一个长度为 10、且用 0x1 填充的 Buffer。 
const buf2 = Buffer.alloc(10, 1);

// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);

// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);

// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');

// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');

Buffer的属性与方法

/*
Buffer.byteLength //所测内容占据几个字节
Buffer.isBuffer() //是否为Buffer对象
Buffer.concat()  //链接buffer对象
*/

console.log(Buffer.byteLength('byte'));   //4
console.log(Buffer.byteLength('字节'));   //6

console.log(Buffer.isBuffer({}));   //false
console.log(Buffer.isBuffer(Buffer.from([1,2,3]));   //true


const buffer1 = Buffer.from('THIS ');
const buffer2 = Buffer.from('IS ');
const buffer3 = Buffer.from('A ');
const buffer4 = Buffer.from('CONCAT ');
const buffer5 = Buffer.from('TEST ');
const buffer = Buffer.concat([buffer1, buffer2, buffer3, buffer4, buffer5]);
console.log(buffer.toString());  // THIS IS A CONCAT TEST

下面说一下buffer的实例的属性与方法

/*
buf.length       // buffer内容的长度
buf.toString()   // 将buffer对象转换为utf-8(默认),可以选用其他方式如base64
buf.fill()       // 填充buffer
buf.equals()     // 比较两个buffer的内容是否相同
buf.indexOf()    // 在buffer里寻找所要找的内容的首位置数,如果找不到则返回-1.
buf.copy()       // 拷贝 buf 的一个区域的数据到 target 的一个区域,即便 target 的内存区域与 buf 的重叠。
*/


const buf = Buffer.alloc(10);
console.log(buf);                //<Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(buf.fill(4,6,10));   //<Buffer 00 00 00 00 00 00 04 04 04 04> fill里边的值依次是所要填充的值,开始位置,结束位置           


const buf1 = Buffer.from('one');
const buf2 = Buffer.from('one');
const buf3 = Buffer.from('three');

console.log(buf1.equals(buf2));  // true
console.log(buf1.equals(buf3));  // false
console.log(buf1.indexOf('e'));  // 2
console.log(buf1.indexOf('f'));  // -1

const buf4 = Buffer.alloc(10);
const buf5 = Buffer.alloc(10).fill('!');
for(var i=0;i<10;i++){
  buf4[i]=i+97; //97是a的ASCII的值
}
console.log(buf4.toString());  // abcdefghij
console.log(buf5.toString());  // !!!!!!!!!!
buf4.copy(buf5,3,0,5);         // 将buf4中的部分覆盖到buf5的部分中去,第二个参数是在buf5中的起始位置,第三个参数是要复制的buf4中的起始位置,第四个参数是要复制的buf4中的末位置但不包括
console.log(buf5.toString());  // !!!abcde!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值