HarmonyOS 鸿蒙Next分次读取文件内容到ArrayBuffer 中

发布于 1周前 作者 htzhanglong 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next分次读取文件内容到ArrayBuffer 中

let file = fileIo.openSync(pathInSandbox, fs.OpenMode.READ_ONLY)

let size = fileIo.statSync(file.fd).size

let arrayBuffer = new ArrayBuffer(size);

let buffSize = 4096;

let buf = new ArrayBuffer(buffSize);

let off = 0, len = 0, readedLen = 0;

// 将读取的数据追加到 arrayBuffer 中

const targetBuffer = new Uint8Array(arrayBuffer);

// 分段读取文件


while ((len = fs.readSync(file.fd, buf, { offset: 0, length: buffSize })) > 0) {

readedLen += len;

const result = new Uint8Array(buf, 0, len);

targetBuffer.set(result, off);

off += len;

}

要分次读取文件内容到一个大的 ArrayBuffer 中,执行上述代码遇到 RangeError: The sum of srcLength and targetOffset is greater than targetLength

2 回复

while ((len = fs.readSync(file.fd, buf, { offset: 0, length: buffSize })) > 0) 

这个0有问题吧,换成off试试呢?

在HarmonyOS(鸿蒙)系统中,如果你想要分次读取文件内容到ArrayBuffer中,你可以通过以下步骤来实现:

  1. 文件访问权限:首先确保你的应用有读取文件的权限,这通常在应用的manifest文件中配置。

  2. 使用FileChannel:通过RandomAccessFile获取FileChannel,这是处理文件I/O操作的高效方式,支持随机访问和定位读写。

  3. 分配ByteBuffer:根据你需要读取的数据量,动态或预先分配一个ByteBuffer,并将其设置为ByteBuffer.allocateDirect(int capacity)以使用直接内存(如果适用),这有助于减少JVM与本地内存之间的复制。

  4. 读取数据:使用FileChannel.read(ByteBuffer dst)方法从文件中读取数据到ByteBuffer。你可以循环调用此方法,每次读取一部分数据,直到文件末尾。

  5. 转换到ArrayBuffer:虽然JavaScript的ArrayBuffer与Java的ByteBuffer不完全相同,但如果你是在一个支持JavaScript的鸿蒙环境中(如使用JS框架开发的鸿蒙应用),你可能需要将ByteBuffer的内容转换为某种形式的字节数组,然后可能通过某种桥接机制(如JNI或鸿蒙的JS框架API)将其传递给JavaScript层,并在那里创建ArrayBuffer

  6. 处理异常:确保你的代码能够妥善处理IOException等可能发生的异常。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。注意,上述地址仅为示例,实际应替换为鸿蒙系统的官方支持或开发者社区链接。

回到顶部