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)}`);
}
}
}
运行结果:

更多关于HarmonyOS鸿蒙Next中使用fileio进行文件读取写入,会出现阻塞的实战教程也可以访问 https://www.itying.com/category-93-b0.html
@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资源时挂起了主线程。

