手机版

NodeJS中缓冲模块的详细说明

时间:2021-10-15 来源:互联网 编辑:宝哥软件园 浏览:

一、开篇分析。

所谓的缓冲区是指“临时存储区”,它是一个用于临时存储输入和输出数据的内存。

JS本身只有String数据类型,没有二进制数据类型,所以NodeJS提供了一个等价于String的全局构造函数Buffer来对二进制数据进行操作。除了读取文件以获得Buffer的实例之外,还可以直接构造它,例如:

复制代码如下:VARBuffer=newbuffer ([0x68,0x65,0x6c,0x6c,0x6f]);

缓冲区类似于字符串,只是字节长度可以通过。长度属性和指定位置的字节也可以通过[index]读取,例如:

复制的代码如下: buffer[0];//0x 68;

缓冲区和字符串可以相互转换,例如,二进制数据可以使用指定的编码转换为字符串:

复制代码如下: varstr=buffer . tostring(' utf-8 ');//你好

将字符串转换为指定编码下的二进制数据:

复制代码如下: varbuffer=new buffer(' Hello ',' UTF-8 ');//缓冲区68 65 6c 6c

有点不同:

缓冲区和字符串之间有一个重要的区别。该字符串是只读的,对该字符串的任何修改都将产生一个新字符串,而原始字符串将保持不变。

至于Buffer,更像是可以做指针操作的C语言数组。例如,可以通过[index]直接修改某个位置的字节。

- -

slice方法不返回新的Buffer,而更像是指向原始Buffer中间位置的指针,如下所示。

[0x68,0x65,0x6c,0x6f] | | binbin.slice (2)因此,slice方法返回的对Buffer的修改将作用于原始Buffer,例如:

复制代码如下:VARBuffer=newbuffer ([0x68,0x65,0x6c,0x6c,0x6f]);var sub=bin . slice(2);sub[0]=0x 65;console.log(缓冲区);//缓冲区68 65 65 6c 6f

如果要复制缓冲区,必须先创建一个新的缓冲区,然后通过复制原始缓冲区中的数据。复制方法。

这类似于申请新内存并复制现有内存中的数据。以下是一个例子。

复制代码如下:VARBuffer=newbuffer ([0x68,0x65,0x6c,0x6c,0x6f]);var dup=新缓冲区(bin . length);buffer . copy(dup);dup[0]=0x 48;console.log(缓冲区);//Buffer 68 65 6c 6c 6fconsole . log(dup);//缓冲区48 65 65 6c 6f

总之,Buffer将JS的数据处理能力从字符串扩展到任意二进制数据。

以上,让大家知道什么是Buffer。在这里,我们来谈谈如何使用它,以及如何在特定场景中使用它。

第二,谈缓冲。

JavaScript对字符串处理非常友好,宽字节和单字节字符串都被视为一个字符串。节点需要处理网络协议、操作数据库、处理图片、上传文件等。并且还需要处理大量的二进制数据。它自己的字符串远远不能满足这些要求,于是Buffer应运而生。

缓冲结构

Buffer是典型的javascript和C结合的模块,性能相关部分用C实现,非性能相关部分用Javascript实现。

当进程启动时,缓冲区已经加载到内存中,并放入全局对象中,因此需要节点。

缓冲区对象:类似于数组,它的元素是十六进制的两位数。

缓冲存储器分配。

Buffer对象的内存分配不在V8的堆内存中,内存应用在Node的c层实现。

为了有效利用请求的内存,Node采用了slab分配机制,这是一种动态内存管理机制,适用于各种*nix操作系统。石板有三种状态:

(1)完全:完全分配状态。

(2)部分:部分分配状态。

(3)空:未分配状态。

缓冲区的转换缓冲区对象可以转换成字符串,支持的编码类型如下:

ASCII、UTF-8、UTF-16LE/UCS-2、Base64、二进制、十六进制

字符串到缓冲区。

新缓冲区(字符串,[编码]),默认utf-8buf.write(字符串,[偏移量]、[长度]、[编码])。

字符串缓冲区

buf . tostring([编码],[开始],[结束])

缓冲区不支持编码类型。

使用Buffer.isEncoding(编码)确定是否支持。

Iconv-lite:纯javascript实现,重量更轻,性能更好,无需C到JavaScript的转换。

Iconv:对c的libiconv库的调用完成。

缓冲区的拼接。

注意' RES . on '(data),function (chunk) {} ',其中参数chunk是一个Buffer对象,直接拼接会自动转换成字符串,对于宽字节字符可能会造成乱码。

解决方法:

(1)通过可读流中的setEncoding()方法,该方法可以使数据事件传输不是一个Buffer对象,而是一个编码的字符串,其中使用了StringEncoder模块。

(2)将Buffer对象临时存储在数组中,最后组装成一个大Buffer,然后编码转换成字符串输出。

缓冲区广泛应用于文件I/O和网络I/O,其性能非常重要,远高于普通字符串。

除了与字符串转换相关的性能损失之外,缓冲区的使用还有一个高水印设置,这对读取文件时的性能非常重要。

一、高水印设置对缓冲存储器的分配和使用有一定的影响。

b、highWaterMark的设置太小,可能会导致系统调用过多。

什么时候用Buffer,什么时候不用?-纯javascript支持unicode,但不支持二进制。在求解TCP流或文件流时,需要对流进行处理。当我们保存非utf-8字符串、二进制和其他格式时,我们必须使用“buffer”。

第三,实例介绍。

复制代码如下:varbuf=newbuffer('这是text concat test!'。),str=“这是text concat测试!”;console.time('buffer concat test!');var列表=[];var len=100000 * buf.lengthfor(var I=0;i100000I){ list . push(buf);len=buf.length}var s1=Buffer.concat(list,len)。toString();console . timeend(' buffer concat test!') ;console.time('string concat test!') ;var列表=[];for(var I=100000;I=0;I-){ list . push(str);} var S2=list . join(“”);console . timeend(' string concat test!') ;

以下是运行结果:

读取速度肯定比字符串快,缓冲区也需要toString()的操作。所以我们在保存字符串的时候,应该使用string或者string,即使大字符串拼接在一起,字符串的速度也不会比缓冲区慢。

我们什么时候需要使用缓冲区?当我们不能时,当我们保存非utf-8字符串、二进制和其他格式时,我们必须使用它们。

第四,总结。

(1) JavaScript适合处理Unicode编码的数据,但对处理二进制数据不友好。(2)因此,在处理TCP流或文件系统时,需要处理八位字节流。(3)节点有几种处理、创建和使用八位字节流的方法。(4)原始数据存储在Buffer实例中,Buffer类似于整数数组,但其内存分配在V8堆栈之外。缓冲区的大小不能更改。(5)处理的编码类型有:ASCII、UTF8、UTF1le、UCS 2(UTF1le的别名)、base64、二进制、十六进制。(6),Buffer是一个全局元素,Buffer实例直接由新的Buffer()获得。

版权声明:NodeJS中缓冲模块的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。