Node.js 缓冲区(Buffer)
-
缓冲区
纯JavaScript是Unicode友好的,但是对于二进制数据却不是。在处理TCP流或文件系统时,必须处理八位位组流。Node提供了Buffer类,该类提供了实例来存储类似于整数数组的原始数据,但对应于V8堆外部的原始内存分配。Buffer类是可以在应用程序中全局访问,而无需导入缓冲区模块。 -
创建缓冲区
Node缓冲区可以通过多种方式构造。方法一以下是创建10个八位字节的未初始化缓冲区的语法-var buf = Buffer.alloc(10);
方法2以下是从给定数组创建Buffer的语法-var buf = Buffer.from([10, 20, 30, 40, 50]);
方法3以下是从给定的字符串和可选的编码类型创建Buffer的语法-var buf = Buffer.from("Simply Easy Learning", "utf-8");
尽管“utf8”是默认编码,但是您可以使用以下任何一种编码:“ascii”,“ utf8”,“ utf16le”,“ ucs2”,“base64”或“ hex”。 -
写入缓冲区
以下是写入Node缓冲区的方法的语法-buf.write(string[, offset][, length][, encoding])
参数- string - 这是要写入缓冲区的字符串数据。
- offset- 这是开始写入缓冲区的索引。预设值为0。
- length - 这是要写入的字节数。默认为buffer.length。
- encoding - 编码使用。'utf8'是默认编码。
返回值此方法返回写入的八位位组数。如果缓冲区中没有足够的空间来容纳整个字符串,它将写入字符串的一部分。示例
尝试一下buf = Buffer.alloc(256); len = buf.write("Simply Easy Learning"); console.log("Octets written : "+ len);
-
从缓冲区读取
以下是从Node缓冲区读取数据的方法的语法-buf.toString([encoding][, start][, end])
参数- encoding - 编码使用。'utf8'是默认编码。
- start- 开始指数开始读取,默认为0。
- end - 结束索引以结束读取,默认为完整缓冲区。
返回值此方法从使用指定字符集编码编码的缓冲区数据中解码并返回字符串。示例
尝试一下buf = Buffer.alloc(26); for (var i = 0 ; i < 26 ; i++) { buf[i] = i + 97; } console.log( buf.toString('ascii')); // outputs: abcdefghijklmnopqrstuvwxyz console.log( buf.toString('ascii',0,5)); // outputs: abcde console.log( buf.toString('utf8',0,5)); // outputs: abcde console.log( buf.toString(undefined,0,5)); // encoding defaults to 'utf8', outputs abcde
-
将缓冲区转换为JSON
以下是将Node缓冲区转换为JSON对象的方法的语法-buf.toJSON()
返回值此方法返回Buffer实例的JSON表示形式。示例
尝试一下var buf = Buffer.from('Simply Easy Learning'); var json = buf.toJSON(buf); console.log(json);
-
串联缓冲区
以下是将Node缓冲区连接到单个Node缓冲区的方法的语法--Buffer.concat(list[, totalLength])
参数- list - 缓冲区的数组列表对象要连接。
- totalLength- 这是连接时缓冲区的总长度。
返回值此方法返回一个Buffer实例。示例
尝试一下var buffer1 = Buffer.from('蝴蝶教程 '); var buffer2 = Buffer.from('简单易学'); var buffer3 = Buffer.concat([buffer1,buffer2]); console.log("buffer3 内容: " + buffer3.toString());
-
比较缓冲区
以下是比较两个Node缓冲区的方法的语法---buf.compare(otherBuffer);
参数- otherBuffer - 这是另一个缓冲区,将与buf比较
返回值返回一个数字,该数字指示它按排序顺序在otherBuffer之前还是之后。示例
尝试一下var buffer1 = Buffer.from('ABC'); var buffer2 = Buffer.from('ABCD'); var result = buffer1.compare(buffer2); if(result < 0) { console.log(buffer1 +" comes before " + buffer2); } else if(result === 0) { console.log(buffer1 +" is same as " + buffer2); } else { console.log(buffer1 +" comes after " + buffer2); }
-
复制缓冲区
以下是复制Node缓冲区的方法的语法-buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])
参数- targetBuffer - 将在其中复制缓冲区的Buffer对象。
- targetStart - 数字,可选,默认值:0
- sourceStart - 数字,可选,默认值:0
- sourceEnd - 数字,可选,默认值:buffer.length
返回值没有返回值。即使目标存储区与源重叠,也将数据从此缓冲区的区域复制到目标缓冲区中的区域。如果未定义,则targetStart和sourceStart参数默认为0,而sourceEnd默认为buffer.length。示例
尝试一下var buffer1 = Buffer.from('ABC'); //copy a buffer var buffer2 = Buffer.alloc(3); buffer1.copy(buffer2); console.log("buffer2 content: " + buffer2.toString());
-
切片缓冲区
以下是获取Node缓冲区的子缓冲区的方法的语法--buf.slice([start][, end])
参数- start - 数字,可选,默认值:0
- end - 数字,可选,默认:buffer.length
返回值返回一个新缓冲区,该缓冲区引用与旧缓冲区相同的内存,但偏移量并由开始(默认为0)和结束(默认为buffer.length)索引进行裁剪。负索引从缓冲区的末尾开始。示例
尝试一下var buffer1 = Buffer.from('jc2182'); //slicing a buffer var buffer2 = buffer1.slice(0,3); console.log("buffer2 content: " + buffer2.toString());
-
缓冲区长度
以下是获取以字节为单位的Node缓冲区大小的方法的语法---buf.length;
返回值返回缓冲区的大小(以字节为单位)。示例
尝试一下var buffer = Buffer.from('jc2182'); //length of the buffer console.log("buffer length: " + buffer.length);