zoukankan      html  css  js  c++  java
  • Node.js缓存

    Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

    但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

    在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

    Buffer 与字符编码

    Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

    const buf = Buffer.from('runoob', 'ascii');
    
    // 输出 72756e6f6f62
    console.log(buf.toString('hex'));
    
    // 输出 cnVub29i
    console.log(buf.toString('base64'));
    

      

    Node.js 目前支持的字符编码包括:

    • ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。

    • utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。

    • utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。

    • ucs2 - utf16le 的别名。

    • base64 - Base64 编码。

    • latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式。

    • binary - latin1 的别名。

    • hex - 将每个字节编码为两个十六进制字符。

    将 Buffer 转换为 JSON 对象

    语法

    将 Node Buffer 转换为 JSON 对象的函数语法格式如下:

    buf.toJSON()

    当字符串化一个 Buffer 实例时,JSON.stringify() 会隐式地调用该 toJSON()。

    返回值

    返回 JSON 对象。

    实例

    const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
    const json = JSON.stringify(buf);
    
    // 输出: {"type":"Buffer","data":[1,2,3,4,5]}
    console.log(json);
    
    const copy = JSON.parse(json, (key, value) => {
      return value && value.type === 'Buffer' ?
        Buffer.from(value.data) :
        value;
    });
    
    // 输出: <Buffer 01 02 03 04 05>
    console.log(copy);
    

      

    执行以上代码,输出结果为:

    {"type":"Buffer","data":[1,2,3,4,5]}
    <Buffer 01 02 03 04 05>
    

      

    缓冲区裁剪

    Node 缓冲区裁剪语法如下所示:

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

    参数

    参数描述如下:

    • start - 数字, 可选, 默认: 0

    • end - 数字, 可选, 默认: buffer.length

    返回值

    返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。

    实例

    var buffer1 = Buffer.from('runoob');
    // 剪切缓冲区
    var buffer2 = buffer1.slice(0,2);
    console.log("buffer2 content: " + buffer2.toString());
    

      

    执行以上代码,输出结果为:

    buffer2 content: ru
    
    

      

    裁剪功能返回的实际是原始缓存区 buffer 或者一部分,操作的是与原始 buffer 同一块内存区域。

    // 裁剪
    var buffer_origin = Buffer.from('runoob');
    var buffer_slice = buffer_origin.slice(0,2);
    console.log("buffer slice content: "+buffer_slice.toString());
    console.log("buffer origin content: "+buffer_origin.toString());
    buffer_slice.write("wirte"); // Write buffer slice
    
    // 裁剪前与原始字符串的改变
    console.log("buffer slice content: "+buffer_slice.toString());
    console.log("buffer origin content: "+buffer_origin.toString());
    

      

    输出:

    buffer slice content: ru
    buffer origin content: runoob
    buffer slice content: wi
    buffer origin content: winoob
    

      

    可以看到对裁剪返回的 buffer 进行写操作同时,也对原始 buffer 进行了写操作。

    摘自:http://www.runoob.com/nodejs/nodejs-buffer.html


  • 相关阅读:
    二分思想判断数组中是否有两数和为sum
    VC中#pragma warning指令
    (转)预编译头文件
    成为一名优秀程序员所需要知道的那些事
    SetThreadAffinityMask设置使用多核CPU的哪个核心
    DirectX 3D 设备丢失(lost device)的处理
    转载 CreateWaitableTimer和SetWaitableTimer函数
    转赵青《剑侠情缘网络版》开发回顾
    转载使用PostThreadMessage在Win32线程间传递消息
    VC使用CRT调试功能检测内存泄漏
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/9581945.html
Copyright © 2011-2022 走看看