node.js中buffer需要知道的一些点
本文为阅读朴灵大大的《深入浅出node.js》笔记:
在前端开发的时候,我们不曾用过buffer,也没得用。buffer是node环境引入的,用来方便应对二进制数据的处理。这里我们对它应该有基础的理解和正确的定位,方能更好的使用它。
1、buffer不属于v8包含的内容
buffer是node通过c++实现的,跟其他的一些核心模块类似,并不是说修改v8使,在v8中实现这个功能。
2、buffer不需要require
我们在使用例如文件模块等等的模块都需要require来引入对应的模块,但buffer不需要,主要原因是因为它太常见了,所以在加载的时候,系统默认就把buffer加载到global上的Buffer上了,所以无需require就可以直接使用它。
3、buffer中用来存储数据的内存不属于v8,不受v8内存限制影响
buffer占用内存分两部分,一部分是buffer对象,一部分的用来存储数据的pool。new出来的buffer对象是属于v8内存的一个对象,与v8的其它变量一样都满足自动垃圾回收的机制。而用来存储数据的pool是由c++直接向系统申请内存来存储的,有自己的内存处理机制。所以buffer数据存储的内存是数据v8之外,不会受到v8的最大内存限制的问题影响。对应的buffer对象会存放pool所在的位置信息和大小信息。
4、buffer和字符串可以很方便的互相转换,但是他们是不同的
a)buffer也有length,但buffer的长度主要跟数据具体存储的字节数相关,而字符串却跟对应编码有关。
b)因为buffer实际上跟对应编码是没有直接关系,所以,你甚至可以在一个buffer里面存储多种编码的内容,只要你能按存放的位置取出对应的内容即可。
c)平常的数据流操作的时候,使用的其实都是buffer,方便数据的二进制传输,而字符串主要是引擎中字符串操作时使用的。
buffer常见处理技巧:
1、我们经常在读取一个数据流的情况下用chunks+=chunk的形式来把数据流data事件返回的信息拼接在一起:
var rs=createReadStream();
var chunks='';
rs.on('data',function(chunk){
chunks+=chunk;
});
rs.on('end',function(){
console.log(chunks);
});
这里主要的问题在于,data事件传入的chunk实际上是一个buffer数据,他的内容可能是截断的,并不是一个完整的字符串,而后面使用了
chunks+=chunk,实际上是把buffer转为字符串再拼接。这里如果是被截断的buffer就可能导致无法正常识别为字符串,展示为乱码。
所以这里应该使用buffer直接拼接为完成的buffer的形式来解决。
var rs=createReadStream();
var chunks=[];
rs.on('data',function(chunk){
chunks.push(chunk);
});
rs.on('end',function(){
console.log(Buffer.concat(chunks));
});
2、我们可能会有一个很长的字符串,需要在每次用户请求时返回给用户,如:
var longStr='';
for(var i=0;i<10*1024;i++){
longStr+='a';
}
//longStr=new Buffer(longStr);
http.createServer(function(req,res){
res.writeHead(200);
res.end(longStr);
});
这种情况下的问题就在于,每次请求调用res.end的时候,都是需要做一次操作等价longStr=new Buffer(longStr);比较浪费cpu,
所以这里应该把这一步的动作提前。把代码中的注释去掉,这样,我们就会把原来的longStr直接存储为Buffer,后续都可以直接使用,不浪费cpu。
本文为阅读朴灵大大《深入浅出node.js》的读书笔记
node.js中buffer需要知道的一些点的更多相关文章
- node.js中Buffer缓冲器的使用
一.什么是Buffer Buffer缓冲器是用来存储输入和输出数据的一段内存.js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了. 所以node.js提供了Buffer类来处理二进 ...
- 学废了系列 - WebGL与Node.js中的Buffer
WebGL 和 Node.js 中都有 Buffer 的使用,简单对比记录一下两个完全不相干的领域中 Buffer 异同,加强记忆. Buffer 是用来存储二进制数据的「缓冲区」,其本身的定义和用途 ...
- Node.js学习 - Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据. 因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- 在Node.js中使用RabbitMQ系列二 任务队列
在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...
- node.js中process进程的概念和child_process子进程模块的使用
进程,你可以把它理解成一个正在运行的程序.node.js中每个应用程序都是进程类的实例对象. node.js中有一个 process 全局对象,通过它我们可以获取,运行该程序的用户,环境变量等信息. ...
- node.js中使用http模块创建服务器和客户端
node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...
- node.js中通过dgram数据报模块创建UDP服务器和客户端
node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端. 一.创建UDP服务器和客户端 服务端: const dgram = require('dg ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- node.js中fs文件系统模块的使用
node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法 ...
随机推荐
- 通过js给android控件WebView设padding
项目中有个界面是用来显示一个网页的,很简单,放个WebView就ok了,可是返回按钮放在哪 ,ui的设计是在底部显示一个半透明的条,左边有一个返回按钮.这个条显示在内容上面.我有一个担心,就是要是最下 ...
- UDP主要丢包原因及具体问题分析
UDP主要丢包原因及具体问题分析 一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...
- iOS textField输入金额的限制,小数点前9位,后面两位
iOS textField输入金额的限制,小数点前9位,后面两位,如果不加小数点,最大位数是9位,加上小数点,最大位数是12位,超出最大位数可删除 - (BOOL)textField:(UITextF ...
- C# WebService服务Post提交
public string WebServerTest(string PostData) { PostData = "jsonData=" + PostData; string P ...
- FlexSlider jQuery滑动切换插件 参数
demo:http://www.sucaihuo.com/jquery/0/6/demo/ FlexSlider是一个非常出色的jQuery滑动切换插件,它支持所有主流浏览器,并有淡入淡出效果.适合所 ...
- VR外包 虚拟现实外包 北京软件公司
我们制作各类型VR全景虚拟现实,增强现实视频制作.录制等项目.品质保证,售后完备,可签合同.contectus: 13911652504(技术经理tommy) 承揽VR外包 虚拟现实外包 U3D外包( ...
- 汇编语言写出的helloworld运行过程
一:首先说一点,这篇文章建立在懂一点汇编的基础上,有几个简单的命令,说以下: 1:-r命令 -r 查看寄存器 -r 寄存器 (如 -r AX) 修改寄存器的值: 2:-d命令 -d 地址:xxxx:x ...
- 图片的DataURL技术
DataURL基本原理 在网页中我们通常用下面的方式来引用一张图片,这样当我们请求网页的时候,浏览器也会想服务器发起一个请求,去请求这张图片. <img src='images/test.jpg ...
- c++ STL 学习记录 草稿。
非常丑陋的尝试实现stl.慢慢修改吧. 1)简单实现 vector和list. 2)思索如何开始编写算法. 1,所有容器继承一个抽象容器.那么算法就可以使用抽象基类的next方法来遍历元素. 容器间耦 ...
- appium 常用API
''.appium api第二弹 锋利的python,这是初稿,2015/1/5 如有错误的地方,请同学们进行留言,我会及时予以修改,尽量整合一份ok的api 作者:Mads Spiral QQ:79 ...