HarmonyOS应用开发实战:猫猫大作战-ArrayBuffer 二进制缓冲区
前言
ArrayBuffer是 JavaScript/ArkTS 中表示二进制数据缓冲区的对象。与普通 Array 不同,ArrayBuffer 是固定长度的连续内存块,适合存储二进制数据。
在「猫猫大作战」中,ArrayBuffer 用于文件读写、网络数据传输、和 TypedArray 配合实现棋盘的高效存储。
一、ArrayBuffer 基础
// 创建 40 字节的缓冲区(5×8 棋盘)constbuffer=newArrayBuffer(40);// 获取字节长度console.info(buffer.byteLength);// 40// 通过 TypedArray 读写constview=newInt8Array(buffer);view[0]=1;// 设置第 1 个字节view[1]=2;// 设置第 2 个字节console.info(view[0]);// 1二、文件读写中的应用
import{fileIo}from'@kit.CoreFileKit';// 从文件读取到 ArrayBufferasyncfunctionreadFileToBuffer(path:string):Promise<ArrayBuffer>{constfile=fileIo.openSync(path,fileIo.OpenMode.READ_ONLY);conststat=fileIo.statSync(path);constbuffer=newArrayBuffer(stat.size);fileIo.readSync(file.fd,buffer);fileIo.closeSync(file);returnbuffer;}// 将 ArrayBuffer 写入文件asyncfunctionwriteBufferToFile(path:string,buffer:ArrayBuffer):Promise<void>{constfile=fileIo.openSync(path,fileIo.OpenMode.CREATE|fileIo.OpenMode.WRITE_ONLY|fileIo.OpenMode.TRUNC);fileIo.writeSync(file.fd,buffer);fileIo.closeSync(file);}三、与 JSON 配合
// ArrayBuffer → string → JSONconststr=newTextDecoder().decode(buffer);constdata=JSON.parse(str);// JSON → string → ArrayBufferconstjsonStr=JSON.stringify(data);constnewBuffer=newTextEncoder().encode(jsonStr).bufferasArrayBuffer;四、TypedArray 视图
constbuffer=newArrayBuffer(40);// 不同的 TypedArray 视图constint8=newInt8Array(buffer);// 40 个元素(每个 1 字节)constuint8=newUint8Array(buffer);// 40 个元素constint16=newInt16Array(buffer);// 20 个元素(每个 2 字节)constfloat32=newFloat32Array(buffer);// 10 个元素(每个 4 字节)| TypedArray | 元素大小 | 元素个数 | 取值范围 |
|---|---|---|---|
| Int8Array | 1 字节 | 40 | -128~127 |
| Uint8Array | 1 字节 | 40 | 0~255 |
| Int16Array | 2 字节 | 20 | -32768~32767 |
| Float32Array | 4 字节 | 10 | 浮点数 |
五、最佳实践
- 定长数据结构用 ArrayBuffer:如棋盘、网格
- 配合 TypedArray 读写:ArrayBuffer 不直接操作
- 文件 I/O 用 ArrayBuffer:fileIo.readSync/writeSync 接收 ArrayBuffer
- 注意字节序:ArrayBuffer 使用小端序
总结
ArrayBuffer 是定长连续内存块,配合 TypedArray 实现高效的二进制数据存储和文件 I/O。核心要点:new ArrayBuffer(size)创建、TypedArray视图读写、 文件 I/O 的 buffer 参数。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
- ArrayBuffer MDN 文档
- 文件 I/O API
- 第 144 篇:taskpool
- 第 150 篇:TypedArray