简单入门 Buffer
如果你第一次认识 buffer,你可能会很陌生,因为在前端的 JavaScript 中并没有 buffer,因为前端只要做一些字符串操作或 DOM 基本操作就能满足业务需求。
buffer 是什么?
buffer 是 Node 底层通过 C++申请的内存,通过 JS 来分配内存。也就是存放文件的缓冲区。那么问题来了,为什么叫做缓存区,了解之前就要先跟大家科普一下 V8 的内存限制。
当我们在代码中声明变量并赋值时,所使用对象的内存就分配在堆中。如果已申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆的大小超过 V8 的限制为止。(64 位系统下约为 1.4 GB,32 位系统下约为 0.7 GB)
那么又为什么要限制,其实这样设计是有目的,方便 V8 做垃圾回收,在做垃圾回收时 JS 是停滞的,等待垃圾回收完成再恢复,所以垃圾回收的耗时关系到我们的性能,当内存太大就耗时越长,所以 V8 要这么限制。
在这样的限制下,将会导致 Node 无法直接操作大内存对象,比如无法将一个 2 GB 的文件读入内存中进行字符串分析处理,那么我们就将文件读取到 buffer 中,暂时存放,所以叫做缓冲区。
const fs = require('fs') fs.readFile('./a.js', { encoding: 'utf8' }, (err, data) => { if (!err) { fs.writeFile('./b.js', data, { encoding: 'utf8' }, (err, data) => { if (err) { console.log('写入失败') } }) } else { console.log('读取失败') } })
不要使用 fs.readFiles
和 fs.writeFile
直接进行大文件操作,而是使用 fs.createReadStream
和 fs.createWriteStream
方法通过流的方式实现对大文件的操作。
let reader = fs.createReadStream('a.js'); let writer = fs.createWriteStream('b.js'); reader.pipe(writer);
通过流的方式操作文件里面的原理也就是使用了 buffer 作为缓冲。每次读一点写一点。
虽然 buffer 是申请的内存,不受 V8 内存的限制,但是物理内存依然是有限的。
了解 Buffer
Buffer 是一个像 Array 的对象,但它主要用于 操作字节 。
由于 Buffer 太过常见,Node 在进程启动时就已经加载了它,并将其放在全局对象(global)上。所以在使用 Buffer 时,无须通过 require()
即可直接使用。
Buffer 对象类似于数组,它的元素为 16 进制的两位数,即 0 到 255 的数值。
let buf = Buffer.from('hello', 'utf8')
console.log(buf)
// <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
console.log(buf.length) // 5
console.log(buf[0]) // 104
可以访问 length
属性得到长度(表示的是字节的长度,在 utf8 编码中汉字是 3 字节,英文是 1 字节),也可以通过下标访问元素。
关于下标访问元素需要注意的是要经历一个计算的过程。我们通过获取第一个字母为例,首先是 h
根据 ASCII 码对照表查出来 16 进制是 68,然后通过 JS 中的 toString
方法传入参数为 2 表示转换成二进制,得到 1101000
,然后再换成 10 进制的数就变成了 104,所以通过下标访问的第一个元素结果是 104,具体代码如下。
let buf = Buffer.from('hello', 'utf8')
console.log(buf)
// <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
console.log((0x68).toString(2))
// 1101000
Buffer.from
的用法在这里介绍一下,第一个参数是字符串,表示创建一个包含字符串的 buffer,第二个参数是指定字符的编码,默认值也是 utf8
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: Nodejs 附件下载
下一篇: 不要相信一个熬夜的人说的每一句话
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论