首先,开放分析
所谓缓冲区缓冲区,它的意思是临时存储
js
语言本身只有字符串数据
类型,没有二进制数据类型。因此,NodeJS提供了一个全局构造
函数缓冲等价的字符串,它提供了
操作二进制数据。除了能够读取一个
文件得到缓冲的一个实例,可以直接构造,例如:
复制代码代码如下所示:
VaR缓冲=新的缓冲区({ 0x68,0x65,0x6c,0x6c,0x6f });
缓冲区,像字符串一样,除了可以获得字节长度的长度
属性外,还可以通过{ }读取指定
位置的字节,例如:
复制代码代码如下所示:
缓冲{ 0 }; / / 0x68;
缓冲区和字符串可以互相
转换,例如,使用指定的编码将二进制数据转换成字符串:
复制代码代码如下所示:
var str = buffer.tostring(UTF-8); / /你好
在指定的代码下将字符串转换为二进制数据:
复制代码代码如下所示:
var缓冲区=新缓冲区()
有点不同:
缓冲区和字符串之间有一个重要的
区别。字符串是只读的,对字符串的任何
修改都是一个新字符串,原始字符串保持不变。
至于Buffer,它更像是一组C语言,可以进行指针操作。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
切片
方法不会返回到一个新的缓冲区,但更像指向指向原始缓冲区中间位置的指针,如下所示。
{ 0x68,0x65,0x6c,0x6c,0x6f }
^ ^ ^
| |
Bin bin.slice(2)
因此,对切片方法返回的缓冲区的修改将对原始缓冲区起
作用,例如:
复制代码代码如下所示:
VaR缓冲=新的缓冲区({ 0x68,0x65,0x6c,0x6c,0x6f });
VaR子= bin.slice(2);
子{ 0 } = 0x65;
console.log(缓冲区); / /
如果要复制缓冲区,必须首先
创建一个新的缓冲区,并通过复制方法将原始缓冲区中的数据复制。
这类似于应用一个新的
内存和复制现有的内存数据。
复制代码代码如下所示:
VaR缓冲=新的缓冲区({ 0x68,0x65,0x6c,0x6c,0x6f });
VaR DUP =新的缓冲区(仓。长度);
Buffer.copy(DUP);
DUP { 0 } = 0x48;
console.log(缓冲区); / /
console.log(DUP); / /
总之,缓冲区将JS的数据
处理能力从字符串
扩展到任意二进制数据。
上面简单地让您知道什么是Buffer,下面是关于如何使用和使用场景的
详细说明。
二、谈谈缓冲区
Javascript对字符串处理非常友好,不管它是一个宽字节还是一个单字节字符串,它被认为是一个字符串。在节点中,我们需要处理
网络协议、操作数据库、处理
图片、
上传文件等,还需要处理大量二进制数据。我们带来的字符串远远不能满足这些要求,所以Buffer应运而生。
缓冲结构
缓冲区是一个典型的Javascript和C++组合模块,
性能相关的部分是用C++实现的,而非性能相关的部分是用Javascript实现。
在
进程开始时,节点被添加到内存中,并将其放入全局对象中,因此不需要缓冲区。
缓冲区对象:类似于一个数组,其元素是两位数的16位数字。
缓冲区的内存分配
该缓冲区对象的内存分配是不是V8的堆内存,而内存的应用是在节点的C++实现。
为了有效地使用内存的应用,平板
配置机制应用于节点板是一个动态的内存
管理机制,以及各种*nix操作
系统的应用。板有三种状态:
(1)满:完全分布式状态
(2)偏态:部分分布态
(3)空:没有分布状态。
缓冲区的转换
缓冲区对象可以用字符串相互转换,并且
支持的编码类型如下所示:
ASCII,UTF-8,UTF-16LE / UCS-2,base64二进制,海克斯
字符串缓冲区
新的缓冲区(STR,{ },
默认的UTF-8编码)
Buf.write(String,{偏},{长},{编码})
将字符串缓冲区
Buf.toString({ } {开始},编码,{结束})
缓冲区不支持的代码类型
确定它是否是支持Buffer.isEncoding(编码)
iconv建兴:纯Javascript实现,更轻,比C++更好性能的Javascript
iconv:的libiconv库调用C++完成
缓冲区的拼接
请注意,res.on(数据
功能(块){ })
uff1a解
(1)通过,()在读取流的方法,这种方法可以使数据
传输不再是一个缓冲区对象,但编码的字符串,其stringencoder模块内部使用。
(2)缓冲对象存储在数组中,然后将后编码转换成大缓冲区中的字符串输出。
缓冲区广泛应用于文件I/O和网络I/O,其性能非常重要,比普通字符串性能高很多。
缓冲区的使用已经在另外一个字符串转换的性能损失,但highwatermark
设置对性能的
影响的关键时的文件读取。
一、highwatermark设置和使用缓冲区的内存分配一定的影响。
B、highwatermark设置太小,导致过多的系统调用。
缓冲区是什么,不是由纯Javascript支持Unicode码和二进制的支持不是
什么时候,当溶液的TCP流或文件流,流处理是必要的,我们
保存UTF-8字符串,当2进制等格式,我们要使用的缓冲区。
三,实例
介绍 复制代码代码如下所示:
VaR buf =新的缓冲区(这是
文本连接测试!));
console.time(缓冲连接测试!;
var列表{ };
VaR len = 100000 * buf.length;
对于(var i = 0;i < 100000;i + +){
List.push(BUF);
buf.length len =;
}
VaR S1 = buffer.concat(列表,Len)ToString();
Console.timeEnd(缓冲连接测试!;
console.time(字符串连接测试!;
var列表{ };
对于(var i = 100000;i = 0;i -){
List.push(STR);
}
VaR S2 = list.join();
Console.timeEnd(字符串连接测试!;
以下是手术的结果:
阅读
速度肯定是快于字符串,和缓冲区需要toString()操作。所以当我们保存的字符串,我们使用字符串使用字符串,即使大字符串拼接字符串不低于缓冲。
那么我们什么时候需要再次使用缓冲区呢当我们没有办法,我们要使用它时,我们把非UTF-8字符串,2带,等。
四,总结
(1)Javascript适合处理Unicode编码的数据,但二进制数据的处理不友好。
(2)因此,处理TCP字节流或文件系统是处理八位字节所必需的。
(3)Node有几种处理、创建和消耗八位字节流的方法。
(4)原始数据存储在缓冲区实例中,缓冲区类似于整数数组,但它的内存被分配到V8堆栈之外。缓冲区的大小不能更改。
(5)编码的类型有:ASCII,UTF8,utf16le,UCS2(别名utf16le),base64二进制,十六进制。
(6)Buffer是一个全局元素,直接的新缓冲区()获取缓冲区实例。