关于鸿蒙的文件读写讲解--崩溃边缘挣扎

实现的主要功能是 通过log写入本地 将日志上传到服务器 这个功能

我还是要吐槽一下 鸿蒙的api 对开发者贼不友好。不同版本的api的差异真的有点大

目前的鸿蒙在开发资料也不多,不像android那样,随处都有。全靠官方提供的开发文档

由于鸿蒙3.1(api9)版本 还处于beta阶段 对测试机也只有高端机两部手机可以用
项目直接切到api8(主要是穷)

1.获取app的 cache路径

华为手机管理文件 我是看不到这个文件,估计是权限问题,这里是用了 androidstudio 编辑器 来看(后面调试可以观察到文本数据的变化--test.txt)

image.png

image.png

相关代码块

async function writeLogToFile(log) {
  var context = featureAbility.getContext();
  context.getCacheDir((err, data) => {
    console.info("getCacheDir err: " + JSON.stringify(err) + "data: " + JSON.stringify(data));
    let path = data + "/test.txt"
    //文件操作
    write(log, path)
  });
}

2.对文件进行读写

这里由于不同版本提供的api差异区别,看文档需要注意。目前我是以鸿蒙3.0(api8)的来写,这里也是最痛苦的,有的api也不维护了,大家自己感受

看了开发文档,提供的FileIO的操作还是很多,需要根据自己业务需求使用适当api. 这里我是使用了它提供的 fileio.createStream7+ 来实现,这里不展开了,具体看文档

参考文档地址

相关代码块

async function write(log, path) {
  await fileio.createStream(path, "a+").then(function (stream) {
    console.info("createStream succeed");
    stream.writeSync(log + "\n")
    stream.flushSync()
    stream.close()
  }).catch(function (err) {
    console.info("createStream failed with error:" + err);
  });
}

3.完整代码如下

import fileio from '@ohos.fileio';
import hilog from '@ohos.hilog';
import prompt from '@ohos.prompt';
import featureAbility from '@ohos.ability.featureAbility';
import app from '@system.app';
import writeFileSync from '@system.file';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Button(this.message)
          .fontSize(50)
          .onClick(() => {
            for (let index = 0; index < 1000; index++) {
              writeLogToFile("test" + index)
              if (index == 999) {
                prompt.showToast({ message: "结束" })
              }

            }

          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

async function writeLogToFile(log) {
  var context = featureAbility.getContext();
  context.getCacheDir((err, data) => {
    console.info("getCacheDir err: " + JSON.stringify(err) + "data: " + JSON.stringify(data));
    let path = data + "/test.txt"
    //文件操作
    write(log, path)
  });
}

async function write(log, path) {
  await fileio.createStream(path, "a+").then(function (stream) {
    console.info("createStream succeed");
    stream.writeSync(log + "\n")
    stream.flushSync()
    stream.close()
  }).catch(function (err) {
    console.info("createStream failed with error:" + err);
  });
}

运行后的效果

多次测试,异步写入 每次数据都是1000条整,没有问题


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容