在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缓冲区Buffer

B站学习视频
在这里插入图片描述

是内存空间的一部分,内存空间预留了一部分空间叫缓冲区.
在这里插入图片描述

缓冲区存在的必要性:因为读写内存中的数据比读写磁盘上的数据快,如下图
在这里插入图片描述
磁盘与缓冲区之间是通过DMA技术进行传输,无需CPU处理,提高磁盘读写效率,
在这里插入图片描述
在这里插入图片描述
应用程序通过Buffer对象的get方法读取缓冲区的数据

在这里插入图片描述
缓冲区的数据读取完之后,通过channel方法补充数据
在这里插入图片描述

Arraybuffer是一个黑盒–下面的视频很有用

B站视频
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在 HarmonyOS/OpenHarmony 应用开发中,ArrayBuffer 是 JavaScript 中用于处理 二进制数据 的核心对象,它表示一个通用的、固定长度的原始二进制数据缓冲区。以下从基础概念到实际应用场景的完整解析:


一、ArrayBuffer 核心特性

特性 说明
不可变性 创建后长度固定,无法直接修改(需通过视图对象操作)
内存分配 分配连续的二进制内存空间,适合高效处理音频、图片、协议数据等
平台无关性 字节序(大端/小端)由视图对象(如 DataView)控制
兼容性 所有 HarmonyOS API 支持二进制交互的场景均可使用

二、创建与基础操作

1. 创建 ArrayBuffer
// 创建 8 字节的缓冲区
const buffer = new ArrayBuffer(8); 
console.log(buffer.byteLength); // 输出: 8
2. 通过视图操作数据

ArrayBuffer 需通过 类型化数组DataView 访问:

// 使用 Uint8Array 视图(无符号 8 位整数)
const uint8View = new Uint8Array(buffer);
uint8View[0] = 0xFF; // 第一个字节写入 255

// 使用 DataView(支持灵活字节操作)
const dataView = new DataView(buffer);
dataView.setInt16(2, 1000, true); // 从偏移量2写入小端Int16数值1000

三、HarmonyOS 中的典型应用场景

1. 文件系统操作

使用 @ohos.file.fs 模块读写二进制文件:

import fs from '@ohos.file.fs';

// 读取文件到 ArrayBuffer
const filePath = 'internal://app/files/image.jpg';
const fd = fs.openSync(filePath, fs.OpenFlags.READ_ONLY);
const fileInfo = fs.statSync(filePath);
const buffer = new ArrayBuffer(fileInfo.size);
fs.readSync(fd, buffer); // 数据填充到 buffer
fs.closeSync(fd);

// 写入 ArrayBuffer 到新文件
const outputPath = 'internal://app/files/copy.jpg';
const fdOut = fs.openSync(outputPath, fs.OpenFlags.CREATE | fs.OpenFlags.READ_WRITE);
fs.writeSync(fdOut, buffer);
fs.closeSync(fdOut);
2. 网络通信

处理二进制协议或文件上传:

import http from '@ohos.net.http';

// 上传图片二进制数据
const httpRequest = http.createHttp();
const buffer = ...; // 从文件读取的 ArrayBuffer
httpRequest.request(
  "https://api.example.com/upload",
  {
    method: http.RequestMethod.POST,
    extraData: buffer,
    header: { 'Content-Type': 'application/octet-stream' }
  },
  (err, data) => { /* 处理响应 */ }
);
3. 加解密操作

结合 @ohos.security.huks 进行数据加密:

import huks from '@ohos.security.huks';

async function encryptData(plainText: string): Promise<ArrayBuffer> {
  const keyAlias = 'my_aes_key';
  const plainBuffer = new TextEncoder().encode(plainText);
  const encryptResult = await huks.encrypt({ alias: keyAlias, data: plainBuffer });
  return encryptResult.data; // 返回加密后的 ArrayBuffer
}

四、与 Node.js Buffer 的对比

特性 ArrayBuffer Node.js Buffer
所属标准 ECMAScript 标准 Node.js 特有
操作方式 需通过视图(TypedArray/DataView) 直接操作
内存管理 手动控制 自动内存回收(V8 引擎管理)
使用场景 浏览器/跨平台应用 仅限 Node.js 环境

五、关键技巧

1. 类型化数组转换
// ArrayBuffer ↔ Uint8Array
const uint8Array = new Uint8Array(buffer);
const newBuffer = uint8Array.buffer;

// ArrayBuffer ↔ 字符串
const decoder = new TextDecoder('utf-8');
const str = decoder.decode(uint8Array);
const encoder = new TextEncoder();
const strBuffer = encoder.encode("Hello").buffer;
2. 合并多个 ArrayBuffer
function concatBuffers(buffers: ArrayBuffer[]): ArrayBuffer {
  const totalLength = buffers.reduce((acc, buf) => acc + buf.byteLength, 0);
  const result = new Uint8Array(totalLength);
  let offset = 0;
  buffers.forEach(buf => {
    result.set(new Uint8Array(buf), offset);
    offset += buf.byteLength;
  });
  return result.buffer;
}

六、内存管理注意事项

  1. 及时释放引用
    不再使用的 ArrayBuffer 应及时解除引用,方便垃圾回收。

    let largeBuffer = new ArrayBuffer(1024 * 1024 * 100); // 100MB
    // 使用后释放
    largeBuffer = null;
    
  2. 避免内存泄漏
    使用 fs 模块时,确保关闭文件描述符:

    const fd = fs.openSync(...);
    try {
      // 操作文件...
    } finally {
      fs.closeSync(fd);
    }
    

七、调试技巧

通过十六进制查看 ArrayBuffer 内容:

function bufferToHex(buffer: ArrayBuffer): string {
  return Array.from(new Uint8Array(buffer))
    .map(b => b.toString(16).padStart(2, '0'))
    .join(' ');
}

const buf = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]).buffer;
console.log(bufferToHex(buf)); // 输出: 48 65 6c 6c 6f

掌握 ArrayBuffer 的使用,能够高效处理 HarmonyOS 中的二进制数据交互场景(如文件、网络、加密等),是进阶开发的必备技能。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐