在 Node.js 中,Buffer 是处理二进制数据的重要工具之一。它可以用来存储和操作任意格式的数据,包括文字、图片、音视频等。
本文将详细介绍 Buffer 的定义、创建、操作和转换等方面,并提供相关的示例代码和实用技巧。
什么是 Buffer?
Buffer 是 Node.js 自带的全局对象,用于在内存中存储二进制数据流。
它类似于数组,但是可以存储各种类型的数据,而不仅仅是数字。同时,它的数据也是以字节为单位存储和读取的,这就使得 Buffer 可以直接在网络传输、文件读写等场景中使用。
如何创建 Buffer?
Buffer 可以通过四种方式创建:
new Buffer.alloc(size)
创建指定大小的 Buffer 实例,其中 size 表示要创建的 Buffer 的长度(以字节为单位)。常常用于创建新的缓存区。
const buffer = Buffer.alloc(10); // 创建一个长度为10的、以0填充的缓存区。 console.log(buffer); // <Buffer 00 00 00 00 00 00 00 00 00 00>
new Buffer.from(array)
将数字数组转换为 Buffer 实例,其中 array 表示该数组。
const buffer = Buffer.from([ 0x62, 0x75, 0x66, 0x66, 0x65, 0x72 ]); // 将数字数组转换为Buffer实例 console.log(buffer); // <Buffer 62 75 66 66 65 72>
new Buffer.from(string, encoding)
将字符串转换为 Buffer 实例,其中 string 表示该字符串,encoding 表示使用的编码方式,默认为 utf8 编码。
const buffer = Buffer.from('butter', 'utf8'); // 将字符串转换为Buffer实例 console.log(buffer); // <Buffer 62 75 74 74 65 72>
Buffer.concat(list, [totalLength])
将一组 Buffer 实例拼接为一个 Buffer 实例,其中 list 表示一组 Buffer 实例,totalLength 表示拼接后的总长度,如果不提供,则默认为 list 中所有 Buffer 实例的长度之和。
const buff1 = Buffer.from('hello'); const buff2 = Buffer.from('world'); const buffer = Buffer.concat([ buff1, buff2 ]); // 将两个Buffer实例拼接为一个Buffer实例 console.log(buffer); // <Buffer 68 65 6c 6c 6f 77 6f 72 6c 64>
如何操作 Buffer?
Buffer 提供了一系列的方法,用于对其进行读取、写入、截取、填充等操作。
buffer.toString([encoding], [start], [end])
将 Buffer 实例转换为字符串,其中 encoding 表示使用的编码方式,默认为 utf8 编码,start 和 end 表示要读取的的字节范围,默认为整个 Buffer。
const buffer = Buffer.from('butter', 'utf8'); const str = buffer.toString('base64'); console.log(str); // YnV0dGVy
buffer.write(string, [offset], [length], [encoding])
将字符串写入到 Buffer 实例中,其中 string 表示要写入的字符串,offset 表示写入的起始位置(以字节为单位),length 表示写入的长度,encoding 表示使用的编码方式,默认为 utf8 编码。
const buffer = Buffer.alloc(6); const len = buffer.write('hello', 1, 4, 'utf8'); console.log(buffer); // <Buffer 00 68 65 6c 6c 00> console.log(len); // 4
buffer.slice([start], [end])
截取一段 Buffer 实例中的字节,其中 start 和 end 表示要截取的字节范围,默认为整个 Buffer。
const buffer = Buffer.from('butterfly'); const slice = buffer.slice(0, 6); console.log(slice); // <Buffer 62 75 74 74 65 72>
buffer.fill(value, [start], [end])
将 Buffer 实例中的所有字节填充为指定的值,其中 value 表示要填充的值,start 和 end 表示要填充的字节范围,默认为整个 Buffer。
const buffer = Buffer.alloc(6); buffer.fill(0); console.log(buffer); // <Buffer 00 00 00 00 00 00>
buffer.copy(target, [targetStart], [sourceStart], [sourceEnd])
将 Buffer 实例中的一段字节复制到另一个 Buffer 实例中,其中 target 表示目标 Buffer 实例,targetStart 表示要写入的起始位置(以字节为单位),sourceStart 和 sourceEnd 表示要复制的字节范围,默认为整个 Buffer。
const source = Buffer.from('hello'); const target = Buffer.alloc(10); source.copy(target, 1, 0, 5); console.log(target); // <Buffer 00 68 65 6c 6c 6f 00 00 00 00>
如何转换 Buffer?
Buffer 还可以通过 toString、JSON.stringify 和 Buffer.from 等方法与其他数据类型进行转换。
toString
通过 toString 方法将 Buffer 实例转换为字符串。
const buffer = Buffer.from('butter', 'utf8'); const str = buffer.toString('base64'); console.log(str); // YnV0dGVy
JSON.stringify
通过 JSON.stringify 方法将 Buffer 实例转换为 JSON 格式的字符串。
const buffer = Buffer.alloc(6); const json = JSON.stringify({ buffer }); console.log(json); // {"buffer":{"type":"Buffer","data":[0,0,0,0,0,0]}}
Buffer.from
通过 Buffer.from 方法将 JSON 格式的字符串转换为 Buffer 实例。
const json = '{"type":"Buffer","data":[98,117,116,116,101,114]}'; const buffer = Buffer.from(JSON.parse(json)); console.log(buffer); // <Buffer 62 75 74 74 65 72>
如何优化 Buffer?
Buffer 的使用也需要谨慎,特别是在处理大规模数据的场景中。以下是几个可以优化 Buffer 使用的技巧:
使用 new Buffer.allocUnsafe(size) 代替 new Buffer.alloc(size)
在创建指定大小的 Buffer 实例时,使用 new Buffer.allocUnsafe(size) 可以比 new Buffer.alloc(size) 更加高效,因为它不会初始化缓存区的内容,而是使用已经存在的内存空间。
const buffer1 = Buffer.allocUnsafe(10); // 创建一个大小为10的Buffer实例,该实例的内容未初始化 const buffer2 = Buffer.alloc(10); // 创建一个大小为10的Buffer实例,该实例的内容被初始化为0
使用 Buffer.from(array) 代替 new Buffer(array)
在将数字数组转换为 Buffer 实例时,使用 Buffer.from(array) 可以比 new Buffer(array) 更加安全,因为它可以检查输入的数字数组是否超出了有效的范围。
const buffer1 = Buffer.from([ 300 ]); // 报错,数字数组中的数值超过了有效范围 const buffer2 = new Buffer([ 300 ]); // 不报错,但是实际上只有最后一个字节是有效的
使用 Buffer.from(string) 代替 new Buffer(string)
在将字符串转换为 Buffer 实例时,使用 Buffer.from(string) 可以比 new Buffer(string) 更加安全,因为它可以避免在使用默认的 utf8 编码时出现不必要的错误。
const buffer1 = Buffer.from('您好', 'gbk'); // 编码不正确,被误解码为utf8 const buffer2 = new Buffer('您好', 'gbk'); // 不报错,但是实际上被以utf8编码保存
使用 Buffer.alloc(size).fill(value) 代替 new Buffer(size).fill(value)
在创建指定大小的、已经填充了初始值的 Buffer 实例时,使用 Buffer.alloc(size).fill(value) 可以比 new Buffer(size).fill(value) 更加高效。
const buffer1 = new Buffer(1024).fill(0); const buffer2 = Buffer.alloc(1024).fill(0);
结论
Buffer 是 Node.js 中处理二进制数据的重要工具之一,它提供了丰富的方法和 API,可以用于存储、读取、写入、转换、截取和填充二进制数据流。
在使用 Buffer 时,我们需要注意一些性能优化的技巧,特别是在处理大规模数据时更加需要。
希望本文能够为大家对 Node.js 中的 Buffer 的理解提供一些帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6706605cd91dce0dc85c82dd