• 技术文章 >web前端 >js教程

    buffer是什么?深入了解Nodejs中的buffer模块

    青灯夜游青灯夜游2021-12-30 19:21:16转载377
    buffer是什么?下面本篇文章带大家深入了解一下Nodejs中的buffer模块,介绍一下创建、复制、拼接、截取、填充Buffer,以及Buffer与String相互转换的方法,希望对大家有所帮助!

    1.buffer是什么?

    我们知道,JS在对字符串、数组、数字、布尔值等都有对应的方法API进行操作处理,而在Node中,还需要文件操作、网络通信、操作数据库、数据传输等能力;文件在存储层面都是以二进制形式表示,在http的请求和响应中数据的传输也是以二进制数据进行传输,所以仅仅目前的JS能力还是不够的,也就在Node中提供了buffer模块。

    即:使得NodeJS拥有像操作字符串一样来操作处理二进制数据的能力。buffer也被称为临时性暂存区,即临时存放输入和输出二进制数据的一段内存。

    在之前的一篇文章聊聊Nodejs中的核心模块:stream流模块(看看如何使用)中,我们了解到在对大文件进行读取操作时候,一般不会一次性全部读取到内存中,而是以流的形式读取一段数据块,而连续的数据块便形成了数据流的概念。而在对数据块读取和写入过程中,数据首先会存储在buffer(临时性暂存区)的内存中,以待被处理。

    1.1 了解buffer内存分配

    buffer对象的内存分配并不是在V8的堆内存中,而是在Node的C++层面实现内存的申请;为了高效的使用申请来得内存,Node中采用slab分配机制(一种动态内存管理机制)。

    1. 2 buffer的全局性

    Node在进程启动时buffer就已经加装进入内存,并将其放入全局对象,使用时候可以无需require引入,但是官方但仍然建议通过 import 或 require 语句显式地引用它。

    2. 创建Buffer

    buffer实例除了可以在文件读取,http请求得到之外,还可以通过手动方式构造创建。

    2.1 Buffer.alloc(size[, fill[, encoding]])

    参数:

    import { Buffer } from 'buffer';
    
    const buf = Buffer.alloc(8);
    
    console.log(buf);
    // <Buffer 00 00 00 00 00 00 00 00>

    2.2 Buffer.allocUnsafe(size)

    参数:

    import { Buffer } from 'buffer';
    
    const buf = Buffer.allocUnsafe(8);
    
    console.log(buf);
    // <Buffer e8 bf 99 e6 98 af e4 b8 80 e6>

    2.3 Buffer.from(string[, encoding])

    创建包含传入string的新buffer

    参数:

    import { Buffer } from 'buffer';
    
    const buf = Buffer.from('hello buffer');
    
    console.log(buf);
    // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

    2.4 Buffer.from(array)

    使用 0255 范围内的字节 array 分配新的 Buffer

    import { Buffer } from 'buffer';
    
    const array = [0x62, 0x78, 0x84];
    const buf = Buffer.from(array);
    
    console.log(buf);
    // <Buffer 62 78 84>

    3. 复制Buffer

    3.1 Buffer.from(buffer)

    参数:

    import { Buffer } from 'buffer';
    // 新建
    const buf1 = Buffer.alloc(10, 2);
    // 复制
    const buf2 = Buffer.from(buf1);
    
    console.log(buf1);
    // <Buffer 02 02 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // <Buffer 02 02 02 02 02 02 02 02 02 02>

    3.2 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

    将buf实例复制到target目标

    import { Buffer } from 'buffer';
    
    const buf1 = Buffer.alloc(10, 2);
    const buf2 = Buffer.allocUnsafe(10)
    // 将buf1复制到buf2
    buf1.copy(buf2);
    
    console.log(buf1);
    // <Buffer 02 02 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // <Buffer 02 02 02 02 02 02 02 02 02 02>

    4. 拼接Buffer

    4.1 Buffer.concat(list[, totalLength])

    返回list中所有buffer实例连接在一起的新buffer

    参数:

    注意

    import { Buffer } from 'buffer';
    
    const buf1 = Buffer.alloc(4, 2);
    const buf2 = Buffer.alloc(4, 3);
    
    const buf3 = Buffer.concat([buf1, buf2]);
    
    console.log(buf1); // <Buffer 02 02 02 02>
    console.log(buf2); // <Buffer 03 03 03 03>
    console.log(buf3); // <Buffer 02 02 02 02 03 03 03 03>

    5. 截取Buffer

    5.1 buf.slice([start[, end]])

    从buf实例中返回新的Buffer实例,返回的新Buffer实例只是源buf实例的引用,即对新返回的实例修改会影响原有的Buffer实例

    参数:

    import { Buffer } from 'buffer';
    
    const buf1 = Buffer.alloc(10, 2);
    // 截取
    const buf2 = buf1.slice(1,4);
    // 截取部分修改
    buf2[0] = 0x63;
    
    console.log(buf1);
    // <Buffer 02 63 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // <Buffer 63 02 02>

    6. 填充Buffer

    6.1 buf.fill(value[, offset[, end]][, encoding])

    参数:

    import { Buffer } from 'buffer';
    
    const buf1 = Buffer.allocUnsafe(8).fill(2);
    
    console.log(buf1);
    // <Buffer 02 02 02 02 02 02 02 02>

    6.2 buf.write(string[, offset[, length]][, encoding])

    根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。

    注意:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分

    参数:

    import { Buffer } from 'buffer';
    // buf1 length为12
    const buf1 = Buffer.alloc(12, 3);
    // write offset大于buf1.length,写入无效
    buf1.write('hello', 12);
    
    console.log(buf1);
    // <Buffer 03 03 03 03 03 03 03 03 03 03 03 03>
    // 部分写入
    buf1.write('hello', 10);
    // <Buffer 03 03 03 03 03 03 03 03 03 03 68 65>

    7. Buffer工具方法

    7.1 Buffer.isBuffer(obj)

    检验传入obj是否为buffer

    import { Buffer } from 'buffer';
    
    const buf1 = Buffer.alloc(12, 3);
    
    console.log(Buffer.isBuffer(buf1));
    // true

    7.2 Buffer.isEncoding(encoding)

    检查传入的编码名称是否被Buffer所支持

    import { Buffer } from 'buffer';
    
    console.log(Buffer.isEncoding('utf-8'))
    // true

    8. Buffer与String的转换

    Buffer转String

    8.1 buf.toString([encoding[, start[, end]]])

    参数:

    import { Buffer } from 'buffer';
    
    const buf1 = Buffer.allocUnsafe(26)
    
    for (let i = 0; i < 26; i++) {
      // 97 是 'a' 的十进制 ASCII 值。
      buf1[i] = i + 97;
    }
    
    console.log(buf1.toString())
    // abcdefghijklmnopqrstuvwxyz

    String转Buffer

    8.2 Buffer.from(string[, encoding])

    参数:

    import { Buffer } from 'buffer';
    
    const buf = Buffer.from('hello buffer');
    
    console.log(buf);
    // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

    9. Buffer与Array的对比

    9.1 与Array类似点

    9.2 与Array不同之处

    更多node相关知识,请访问:nodejs 教程!!

    以上就是buffer是什么?深入了解Nodejs中的buffer模块的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:Nodejs buffer模块
    上一篇:分享给你14个JavaScript数据可视化库 下一篇:JS中如何防止内存泄漏?聊聊5个常见内存错误
    千万级数据并发解决方案

    相关文章推荐

    • 聊聊node中怎么借助第三方开源库实现网站爬取功能• node.js是什么?适用场景有哪些• 深入了解node.js中的module-alias(分享一些避坑方法)• 聊聊Nodejs中的核心模块:stream流模块(看看如何使用)• 通过7个问题来简单认识一下Node.js• 快速了解node16+如何配置对应的sass环境
    1/1

    PHP中文网