HarmonyOS 鸿蒙Next fs.write异步写入文件不能保证写入顺序?

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next fs.write异步写入文件不能保证写入顺序?

您好!我发现用fs.write异步写入文件时,部分数据会错位,fs.writeSync就不会。请问这是系统bug还是异步写文件本身的特性?writeSync是否也是有系统后台缓冲的?

9 回复
我说错位不知是否准确,就是有几个点正弦波数据不连续,上一点数据与下一点数据差别较大,猜测是123变成132。我感觉异常是必现的,每次生成wav文件噪音很大,后循环将数据异步存成文本csv,在电子表格中生成波形图才发现问题,同步存就没有问题。

更多关于HarmonyOS 鸿蒙Next fs.write异步写入文件不能保证写入顺序?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


对了,写成csv是循环多次异步写,不是一次性写
我调试的时候由于pcm数据不好查看,是写成文本csv查看的,才发现数据不连续问题

我说的错位就是正弦波数据不连续,怀疑是错位,猜测是你说的那样,但是没检查是否确实是123变成132。我感觉是必现的,每次生成的wav文件都是很大噪音。先写异步写wav文件头,再一次性异步写入pcm数据,文件头没错位,但是pcm数据就会乱,你们也可写个小程序试试,如果没问题就算了,我也没再用这个方法了。

另外还请问AudioRenderer如何从内存读取数据的例子。谢谢了!

再补充:ArrayBuffer是否有类似buffer.copy()方法?

补充一下,回调函数中let bufTemp:ArrayBuffer=...  改为:

let bufTemp=buffer.from(...)

DevStudio又会提示:Use explicit types instead of "any", "unknown" (arkts-no-any-unknown) <ArkTSCheck>

谢谢您的关注!情况是我胜场了一段正弦波数据,如果用异步写入,部分波形是错开不连续的,还以为是程序写错了,但用同步写入就没问题。几乎是必然这样的,没遇到正常过,但不确定是否每次相同的错位点。异步写这个方案我已经不用了,如果是bug还请关注一下这个现象。

另外,还想请教一个问题:我用AudioRenderer播放wav文件,初始化Render时回调函数输入参数是个ArrayBuffer类型,可能是renderer读取数据用的。我现在想根据你们网上的例子:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/using-audiorenderer-for-playback-V5

改为从内存中读数而不是从文件中,但是我处理的数据放在buffer.alloc产生的类型中,怎么也找不到传到ArrayBuffer的办法,回调函数中也不允许使用buffer.alloc()、buffer.from()等处理方法,如:

深色代码主题
复制
writeDataCallback = (buffer: ArrayBuffer) => {
  try {
    console.info('buffer len='+buffer.byteLength);
    let bufTemp:ArrayBuffer=buffer.from(this.bufWAV,this.iBufRead,buffer.byteLength).buffer;
    buffer=this.bufTemp.buffer;
    //this.bufPCM.copy(buffer,0,0,buffer.byteLength);//类型错误!
    //fs.readSync(fileWave.fd, buffer, { offset: this.iBufRead, length: buffer.byteLength });
    this.iBufRead += buffer.byteLength;
    this.progCurr=this.iBufRead;
    // API version 11 不支持返回回调结果,从 API version 12 开始支持返回回调结果
    return audio.AudioDataCallbackResult.VALID;
  } catch (error) {
    console.error('Error reading PCM source:', error);
    // API version 11 不支持返回回调结果,从 API version 12 开始支持返回回调结果
    return audio.AudioDataCallbackResult.INVALID;
  }
}

buffer.from处DevStudio会提示:Property 'from' does not exist on type 'ArrayBuffer'. <ArkTSCheck>。

请问有什么办法让renderer从内存读取数据而不是文件码?谢谢了!

您好!

错位指的是什么?最后读取失败了吗?是不是写入的数据例如:123,变成了132?

异常是必现的吗?这个是一次写还是多次写?

在HarmonyOS鸿蒙系统中,关于Next fs.write异步写入文件时是否能保证写入顺序的问题,答案主要取决于具体的文件系统和实现方式。一般来说,如果文件系统或API设计为支持异步操作,并且没有明确的顺序保证机制,那么异步写入文件时确实可能无法保证严格的写入顺序。

HarmonyOS的Next文件系统在设计时可能会考虑并发性能和资源利用率,因此可能会采用某种形式的队列管理或缓冲机制来处理异步写入请求。然而,这种机制通常不会向用户保证具体的写入顺序,除非文件系统或API文档中有明确的说明。

如果应用程序需要确保写入顺序,可能需要采取额外的措施,例如使用同步写入操作,或者在应用程序层面实现写入顺序的控制逻辑。

总之,在HarmonyOS鸿蒙系统中,使用Next fs.write进行异步写入文件时,如果文件系统或API没有提供明确的写入顺序保证,那么写入顺序可能无法得到保证。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!