如果你第一次认识buffer,你可能会很陌生,因为在前端的JavaScript中并没有buffer,因为前端只要做一些字符串操作或DOM基本操作就能满足业务需求。
buffer是Node底层通过C++申请的内存,通过JS来分配内存。也就是存放文件的缓冲区。那么问题来了,为什么叫做缓存区,了解之前就要先跟大家科普一下V8的内存限制。
当我们在代码中声明变量并赋值时,所使用对象的内存就分配在堆中。如果已申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆的大小超过V8的限制为止。(64位系统下约为1.4 GB,32位系统下约为0.7 GB)
那么又为什么要限制,其实这样设计是有目的,方便V8做垃圾回收,在做垃圾回收时JS是停滞的,等待垃圾回收完成再恢复,所以垃圾回收的耗时关系到我们的性能,当内存太大就耗时越长,所以V8要这么限制。
在这样的限制下,将会导致Node无法直接操作大内存对象,比如无法将一个2 GB的文件读入内存中进行字符串分析处理,那么我们就将文件读取到buffer中,暂时存放,所以叫做缓冲区。
虽然buffer是申请的内存,不受V8内存的限制,但是物理内存依然是有限的。
Buffer是一个像Array的对象,但它主要用于
操作字节
。
由于Buffer太过常见,Node在进程启动时就已经加载了它,并将其放在全局对象(global)上。所以在使用Buffer时,无须通过 require() 即可直接使用。
Buffer对象类似于数组,它的元素为16进制的两位数,即0到255的数值。
let buf = Buffer.from('hello', 'utf8')
console.log(buf)
console.log(buf.length)
console.log(buf[0])
可以访问 length 属性得到长度(表示的是字节的长度,在utf8编码中汉字是3字节,英文是1字节),也可以通过下标访问元素。
关于下标访问元素需要注意的是要经历一个计算的过程。我们通过获取第一个字母为例,首先是h根据ASCII码对照表查出来16进制是68,然后通过JS中的toString
方法传入参数为2表示转换成二进制,得到1101000
,然后再换成10进制的数就变成了104,所以通过下标访问的第一个元素结果是104,具体代码如下。
let buf = Buffer.from('hello', 'utf8')
console.log(buf)
console.log((0x68).toString(2))
Buffer.from的用法在这里介绍一下,第一个参数是字符串,表示创建一个包含字符串的buffer,第二个参数是指定字符的编码,默认值也是utf8
。
计算机底层存储的数据都是二进制的。在前端开发中一般都是实现页面效果,很少会直接操作二进制的数据。而在 Node.js 擅长的领域,比如在服务端程序开发中,经常会读取文件,处理文件,和二进制数据打交道比较多。Buffer对象是 Node.js 提供的一个全局对象,专门用来处理二进制数据。二进制数据在开发中,操作和表示都非常不方便,所以 Buffer 对象采用十六进制来表示二进制数据。比如二进制数据00001111,转为十六进制就是f。
(1)数组是js语法,js代码性能较差
(2)数组中可以存的数据类型有限,传统的数组不能满足服务端所需的数据类型的需求,比如音频、视频、图片等二进制文件,而Buffer就是专门用来存储二进制文件的
(3) 使用Buffer不需要引入模块,直接用即可
(二)代码演示
1. 将一个字符串保存在Buffer
Buffer.from 语法
var str =
Buffer缓冲器
Buffer 对象是 Node 处理二进制数据的一个接口。它是 Node 原生提供的全 局对象,可以直接使用,不需要 require('buffer')。
Buffer是一个和数组类似的对象,用于存储数据,存储的是二进制数据
1.效率高。存储和读取数据很快,可以直接对计算机的内存和CPU进行操作
2.Buffer的大小一旦确定了,不可修改
3.成员都为 0 到 255 的整数值,即一个 8 位的字节。
4.Buffer是Node中的非常核心的模块,无需下载,无需引入,直接即可使用
Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。
Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。
简单来说就是buffer偏重于写,而cache偏重于读。
Buffer对象1. 概论2. 与二进制数组的关系3. 迭代器4. Buffer构造函数5. 类的方法Buffer.isEncoding(encoding)Buffer.isBuffer(obj)Buffer.byteLength(string[, encoding])Buffer.concat(list[, totalLength])6. 实例属性length7. 实例方法write()slice()toString()toJSON()
1. 概论
Buffer对象是Node处理二进制数据的一个接口。它是
buffer的概念很庞大,根据不同场景,有各种各样功能的buffer,比如双缓冲buffer,jitterbuffer。这篇文章说的buffer,是指一段用于存取数据的内存空间,这是最基础的buffer。然而就是这种最基础的buffer,在C++中标准库也没有提供很通用,完善的buffer类(-_-!)。这一系列文章,将参照webrtc中的,一步步介绍如何实现这样的buffer。......
Node.js—Buffer对象1 概述2 基本操作3 与二进制数组的关系4 Buffer类5 Buffer构造函数6 Buffer类的方法(函数)6.1 Buffer.isEncoding()6.2 Buffer.isBuffer()6.3 Buffer.byteLength()6.4 Buffer.concat()7 实例属性 length8 实例方法8.1 write()8.2 slice()8.3 toString()8.4 toJSON()
Buffer对象是Node处理二进制数据的一个
什么是Buffer?
Buffer简单的来说就如它的字面意思一样是一块缓冲区,就跟火车票售票厅一样,售票厅可以容下一定的人(一旦修建好售票厅,售票厅容量无法更改) , 而售票厅里的人有进有出。不过Buffer里面的人是字节,众所周知一个字节的大小是2^8,但是Buffer用2位16进制的数代替(如31表示3*16+1=49),字节的数代表ascii码字符值(如49代表'1'); 主要用于处...
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。
Java NIO 里关键的 Buffer 实现:
1) ByteBuffer
2) CharBuffer
3) DoubleBuffer
4) FloatBuffer
作者:pansz提到这个问题,可能意味着题主意识到了两者的相关性。的确,他们确实有那么一些联系。首先cache是缓存,buffer是缓冲,虽然翻译有那么一个字的不同,但这...
传统Web弊端:数据不能同步,全局变量冲突使用script引入使用脚手架 检查打开首选项-->settings-->format on save 检查是否开启EPERM: operation not permitted, mkdir