纯JavaScript是Unicode友好的,但是对于二进制数据却不是,在处理TCP流或文件系统时,必须处理八位位组流,Node提供了Buffer类,该类提供了实例来存储类似于整数数组的原始数据,但对应于V8堆外部的原始内存分配。
缓冲区类是全局类,可以在应用程序中访问而无需导入缓冲区模块。
节点缓冲区可以通过多种方式构造。
以下是创建 10 个八位字节的未初始化缓冲区的语法-
var buf=new Buffer(10);
以下是从给定数组创建Buffer的语法-
var buf=new Buffer([10, 20, 30, 40, 50]);
以下是从给定的字符串和可选的编码类型创建Buffer的语法-
var buf=new Buffer("Learnfk Simply Easy Learning", "utf-8");
尽管" utf8"是默认编码,但是您可以使用以下任何一种编码:" ascii"," utf8"," utf16le"," ucs2"," base64"或" hex"。
以下是写入节点缓冲区的方法的语法-
buf.write(string[, offset][, length][, encoding])
string - 这是要写入缓冲区的字符串数据。
offset - 这是开始写入缓冲区的索引,默认值为0。
length - 这是要写入的字节数,默认为buffer.length。
encoding - 要使用的编码。" utf8"是默认编码。
此方法返回写入的八位位组数。如果缓冲区中没有足够的空间来容纳整个字符串,则它将写入字符串的一部分。
buf=new Buffer(256); len=buf.write("Learnfk Simply Easy Learning"); console.log("Octets written : "+ len);
执行以上程序后,将产生以下输出-
Octets written : 20
以下是从节点缓冲区读取数据的方法的语法-
buf.toString([encoding][, start][, end])
encoding - 要使用的编码, " utf8"是默认编码。
start - 开始读取的开始索引,默认为0。
end - 结束读取的索引,默认为完整缓冲区。
此方法从使用指定字符集编码编码的缓冲区数据中解码并返回字符串。
buf=new Buffer(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
执行以上程序后,将产生以下输出-
abcdefghijklmnopqrstuvwxyz abcde abcde abcde
以下是将节点缓冲区转换为JSON对象的方法的语法-
buf.toJSON()
此方法返回Buffer实例的JSON表示形式。
var buf=new Buffer('Learnfk Simply Easy Learning');var json=buf.toJSON(buf); console.log(json);
执行以上程序后,将产生以下输出-
{ type: 'Buffer', data: [ 83, 105, 109, 112, 108, 121, 32, 69, 97, 115, 121, 32, 76, 101, 97, 114, 110, 105, 110, 103 ]}
以下是将节点缓冲区连接到单个节点缓冲区的方法的语法-
Buffer.concat(list[, totalLength])
list - 要连接的Buffer对象的数组列表。
totalLength - 这是连接时缓冲区的总长度。
此方法返回一个Buffer实例。
var buffer1=new Buffer('Learnfk '); var buffer2=new Buffer('Simply Easy Learning'); var buffer3=Buffer.concat([buffer1,buffer2]); console.log("buffer3 content: " + buffer3.toString());
执行以上程序后,将产生以下输出-
buffer3 content: Learnfk Simply Easy Learning
以下是比较两个节点缓冲区的方法的语法-
buf.compare(otherBuffer);
进行比较的缓冲区
返回一个数字,该数字指示它按排序顺序在otherBuffer之前还是之后或与otherBuffer相同。
var buffer1=new Buffer('ABC'); var buffer2=new Buffer('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); }
执行以上程序后,将产生以下输出-
ABC comes before ABCD
以下是复制节点缓冲区的方法的语法-
buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])
targetBuffer - 将在其中复制缓冲区的缓冲区对象。
targetStart - 数字,可选,默认值:0
sourceStart - 数字,可选,默认值:0
sourceEnd - 数字,可选,默认值:buffer.length
没有返回值。即使目标存储区与源重叠,也将数据从此缓冲区的区域复制到目标缓冲区中的区域,如果未定义,则targetStart和sourceStart参数默认为0,而sourceEnd默认为buffer.length。
var buffer1=new Buffer('ABC');//copy a buffervar buffer2=new Buffer(3); buffer1.copy(buffer2); console.log("buffer2 content: " + buffer2.toString());
执行以上程序后,将产生以下输出-
buffer2 content: ABC
以下是获取节点缓冲区的子缓冲区的方法的语法-
buf.slice([start][, end])
start - 数字,可选,默认值:0
end - 数字,可选,默认值:buffer.length
返回一个新缓冲区,该缓冲区引用与旧缓冲区相同的内存,但偏移量由开始(默认为0)和结束(默认为buffer.length)索引进行切片,负索引从缓冲区的末尾开始。
var buffer1=new Buffer('LearnFK');//slicing a buffer var buffer2=buffer1.slice(0,4); console.log("buffer2 content: " + buffer2.toString());
执行以上程序后,将产生以下输出-
buffer2 content: Learn
以下是获取以字节为单位的节点缓冲区大小的方法的语法-
buf.length;
返回缓冲区的大小(以字节为单位)。
var buffer=new Buffer('LearnFk');//length of the buffer console.log("buffer length: " + buffer.length);
执行上述程序时,将产生以下输出-
buffer length: 7
以下是Node.js中可用的Buffers模块的参考。有关更多详细信息,请参阅官方文档。
Sr.No. | Method & 描述 |
---|---|
1 | Buffer.isEncoding(encoding) 如果编码是有效的编码参数,则返回true,否则返回false。 |
2 | Buffer.isBuffer(obj) 判断obj是否为Buffer。 |
3 | Buffer.byteLength(string [,encoding]) 给出字符串的实际字节长度,编码默认为" utf8"。 |
4 | Buffer.concat(list [,totalLength]) 返回一个缓冲区,该缓冲区是将列表中的所有缓冲区连接在一起的输出。 |
5 | Buffer.compare(buf1,buf2) 与buf1.compare(buf2)相同。对排序缓冲区数组很有用。 |