HarmonyOS鸿蒙Next中使用fileio进行文件读取写入,会出现阻塞

HarmonyOS鸿蒙Next中使用fileio进行文件读取写入,会出现阻塞 在代码中导入@ohos.fileio, 进行文件读取写入,会出现程序阻塞。

import { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { util } from '@kit.ArkTS';
import fileio from '[@ohos](/user/ohos).fileio';

const DOMAIN: number = 0X11;
const APP_TAG: string = 'TestDemo';
const TAG: string = '=-=:--->';

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

  aboutToAppear(): void {
    if (this.getUIContext().getHostContext()) {
      let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
      this.url = context.filesDir;
    }
  }

  build() {
    Column({ space: 20 }) {
      Button('Put Data')
        .onClick((event: ClickEvent) => {
          this.putData('Hello World');
        })

      Button('get Data')
        .onClick((event: ClickEvent) => {
          this.getData();
        })
    }
    .alignItems(HorizontalAlign.Center)
    .height('100%')
    .width('100%')
  }

  private  putData(data: string): void {
    let targetUrl: string = `${this.url}/test.txt`;
    try {
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file begin`);
      let fd: number =  fileio.openSync(targetUrl, 0o102 | 0o2);
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file success`);
      hilog.info(DOMAIN, APP_TAG, `${TAG} write data to  targetfile begin`);
      fileio.writeSync(fd, data);
      hilog.info(DOMAIN, APP_TAG, `${TAG} write data to  targetfile success`);
      fileio.closeSync(fd);
    } catch (e) {
      hilog.error(DOMAIN, APP_TAG, `${TAG} putData err:${JSON.stringify(e)}`);
    }
  }

  private getData(): void {
    let targetUrl: string = `${this.url}/test.txt`;
    try {
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file begin`);
      let fd: number = fileio.openSync(targetUrl, 0o102 | 0o2);
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file success`);
      hilog.info(DOMAIN, APP_TAG, `${TAG} read data from  argetfile begin`);
      let arrayBuffer: ArrayBuffer = new ArrayBuffer(1024);
      fileio.readSync(fd, arrayBuffer);
      hilog.info(DOMAIN, APP_TAG, `${TAG} read data to  targetfile success`);
      let decoder = util.TextDecoder.create('utf-8');
      let result: string = decoder.decodeToString(new Uint8Array(arrayBuffer));
      hilog.info(DOMAIN, APP_TAG, `${TAG} the result is:${result}`);
      fileio.closeSync(fd);
    } catch (e) {
      hilog.error(DOMAIN, APP_TAG, `${TAG} getData err:${JSON.stringify(e)}`);
    }
  }
}

运行结果:

cke_17123.png


更多关于HarmonyOS鸿蒙Next中使用fileio进行文件读取写入,会出现阻塞的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

@ohos.fileio 模块从 API version 9 开始废弃,建议使用 @ohos.file.fs 替代。https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-fileio

修改如下:

import { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { util } from '@kit.ArkTS';
import fs from '@ohos.file.fs';

const DOMAIN: number = 0X11;
const APP_TAG: string = 'TestDemo';
const TAG: string = '=-=:--->';

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

  aboutToAppear(): void {
    if (this.getUIContext().getHostContext()) {
      let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
      this.url = context.filesDir;
    }
  }

  build() {
    Column({ space: 20 }) {
      Button('Put Data')
        .onClick((event: ClickEvent) => {
          this.putData('Hello World');
        })
      Button('get Data')
        .onClick((event: ClickEvent) => {
          this.getData();
        })
    }
    .alignItems(HorizontalAlign.Center)
    .height('100%')
    .width('100%')
  }

  private async putData(data: string): Promise<void> {
    let targetUrl: string = `${this.url}/test.txt`;
    try {
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file begin`);
      let file: fs.File = fs.openSync(targetUrl, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file success`);
      hilog.info(DOMAIN, APP_TAG, `${TAG} write data to  targetfile begin`);
      fs.writeSync(file.fd, data);
      hilog.info(DOMAIN, APP_TAG, `${TAG} write data to  targetfile success`);
      fs.closeSync(file);
    } catch (e) {
      hilog.error(DOMAIN, APP_TAG, `${TAG} putData err:${JSON.stringify(e)}`);
    }
  }

  private getData(): void {
    let targetUrl: string = `${this.url}/test.txt`;
    try {
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file begin`);
      let file: fs.File = fs.openSync(targetUrl, fs.OpenMode.READ_ONLY);
      hilog.info(DOMAIN, APP_TAG, `${TAG} open file success`);
      hilog.info(DOMAIN, APP_TAG, `${TAG} read data from  argetfile begin`);
      let arrayBuffer: ArrayBuffer = new ArrayBuffer(1024);
      fs.readSync(file.fd, arrayBuffer);
      hilog.info(DOMAIN, APP_TAG, `${TAG} read data to  targetfile success`);
      let decoder = util.TextDecoder.create('utf-8');
      let result: string = decoder.decodeToString(new Uint8Array(arrayBuffer));
      hilog.info(DOMAIN, APP_TAG, `${TAG} the result is:${result}`);
      fs.closeSync(file);
    } catch (e) {
      hilog.error(DOMAIN, APP_TAG, `${TAG} getData err:${JSON.stringify(e)}`);
    }
  }
}

更多关于HarmonyOS鸿蒙Next中使用fileio进行文件读取写入,会出现阻塞的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,使用fileio进行文件读写时,若操作大文件或同步调用,可能导致主线程阻塞。这是因为fileio的某些API默认同步执行,会等待操作完成才返回。为避免阻塞,建议使用异步API,如fileio.copyFile或fileio.mkdir的异步版本,或通过Promise/async-await处理。此外,检查文件路径和权限设置,确保操作不会因资源问题而挂起。

在HarmonyOS Next中,使用fileio的同步API(如openSync、writeSync、readSync)在主线程执行文件操作确实会导致UI阻塞。这是因为同步操作会阻塞当前线程直到操作完成,当文件较大或设备I/O繁忙时尤为明显。

建议改用异步API:

  • 使用fileio.open()替代openSync
  • 使用fileio.write()替代writeSync
  • 使用fileio.read()替代readSync

异步API通过回调或Promise返回结果,不会阻塞UI线程。例如:

fileio.open(targetUrl, 0o102 | 0o2, (err, fd) => {
  if (!err) {
    fileio.write(fd, data, (writeErr) => {
      // 处理写入结果
      fileio.close(fd);
    });
  }
});

另外,检查文件路径权限和文件状态,确保目标文件可正常访问。日志显示操作开始但未完成,很可能是同步操作在等待I/O资源时挂起了主线程。

回到顶部