buffer缓冲区

Node.js为处理二进制数据如TCP流和文件流,引入了Buffer类。Buffer类似于数组,用于存储二进制数据,提供多种创建方法如Buffer.alloc和Buffer.from。Buffer与字符串间可相互转换,并支持不同字符编码。文章还介绍了Buffer的读写操作及其在内存管理中的特性。
摘要由CSDN通过智能技术生成

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

但在处理像TCP流或文件流时,必须使用到二进制数据。

因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

特点

  • buffer的结构和数组类似,操作方法也与数组类似
  • 数组不能存储二进制文件,buffer是专门存储二进制数据的
  • buffer存储的是二进制数据,但是以16进制的形式显示
  • buffer中每一个元素的范围都是从00~ff
  • 每一个元素占用一个字节内存
  • buffer是对底层内存的直接操作,因此大小一旦确定就不能修改

创建buffer类

Buffer 提供了以下 API 来创建 Buffer 类:

  • Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
  • Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
  • Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
  • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
  • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
  • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
  • Buffer.allocUnsafeSlow(size)

示例

// 创建一个长度为 10、且用 0 填充的 Buffer。
//返回<Buffer 00 00 00 00 00 00 00 00 00 00>
const buf1 = Buffer.alloc(10);

// 创建一个长度为 10、且用 0x1 填充的 Buffer。 
//返回<Buffer 01 01 01 01 01 01 01 01 01 01>
const buf2 = Buffer.alloc(10, 1);

// 创建一个长度为 10、且未初始化的 Buffer。这个方法比调用 Buffer.alloc() 更快,但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);

// 通过数组创建Buffer。
const buf4 = Buffer.from([1, 2, 3]);

//通过字符串创建Buffer。
const buf5 = Buffer.from('test');

buffer与字符串的转换

可以借助toString方法将buffer转为字符串

toString默认按照utf-8编码方式进行转换

const buf = Buffer.from([105,108,111,118,101,121,111,117]);
console.log(buf.toString()); 

buffer与字符编码

Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。

通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

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 将每个字节编码为两个十六进制字符。

示例

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

buffe的读写

buffer可以直接通过[ ]的方式对数据进行处理

示例

//读取
const buf = Buffer.from('test');
console.log(buf[1]);
//查看二进制字符串结果
console.log(buf[1].toString(2)); 
//修改
buf[1]=97;

注意

  • 如果修改的数值超过255,即超过8位数据,高位数字会被舍弃
  • 一个utf-8的中文字符一般占3个字节
请帮我为以下代码添加注释,并排版package T14; //Buffer.java public class Buffer { private int buffer = -1; // buffer缓冲区被producer 和 consumer 线程共享 private int occupiedBufferCount = 0; // 控制缓冲区buffers读写的条件边量 public synchronized void set( int value ) //place value into buffer { String name = Thread.currentThread().getName();//get name of thread that called this method // while there are no empty locations, place thread in waiting state while ( occupiedBufferCount == 1 ) { // output thread information and buffer information, then wait try { //System.err.println("Buffer full. "+ name + " waits." ); wait(); } // if waiting thread interrupted, print stack trace catch ( InterruptedException exception ) { exception.printStackTrace(); } } // end while buffer = value; // set new buffer value ++occupiedBufferCount; System.err.println(name + " writes " + buffer); notify(); // tell waiting thread to enter ready state } // end method set; releases lock on SynchronizedBuffer public synchronized int get() // return value from buffer { // for output purposes, get name of thread that called this method String name = Thread.currentThread().getName(); // while no data to read, place thread in waiting state while ( occupiedBufferCount == 0 ) { // output thread information and buffer information, then wait try { //System.err.println("Buffer empty. "+name + " waits." ); wait(); } catch ( InterruptedException exception ) { exception.printStackTrace(); } } // end while // indicate that producer can store another value , because consumer just retrieved buffer value --occupiedBufferCount; System.err.println( name + " reads " + buffer ); notify(); // tell waiting thread to become ready to execute return buffer; } // end method get; releases lock on SynchronizedBuffer }
06-06
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值