简单入门 Buffer

发布于 2025-01-24 00:59:18 字数 2276 浏览 8 评论 0

如果你第一次认识 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.readFilesfs.writeFile 直接进行大文件操作,而是使用 fs.createReadStreamfs.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
27 人气
更多

推荐作者

笑脸一如从前

文章 0 评论 0

mnbvcxz

文章 0 评论 0

真是无聊啊

文章 0 评论 0

旧城空念

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文