[Harmony]大文件持久化

1.添加权限

在module.json5文件中添加权限

javascript 复制代码
"requestPermissions": [
  {
    "name": "ohos.permission.READ_WRITE_USER_FILE", // 读写用户数据
    "reason": "$string:read_write_user_file_reason",
    "usedScene": {
      "abilities": ["MFLargeDataStorage"],
      "when": "always"
    }
  }
]

string.json

javascript 复制代码
{
  "string": [
    {
      "name": "read_write_user_file_reason",
      "value": "读写用户文件"
    }
  ]
}

2.封装大文件数据持久工具

TypeScript 复制代码
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
import ConsoleLog from '../extension/ConsoleLog';
import { buffer } from '@kit.ArkTS';

class MFLargeDataStorage {
  private static readonly FILE_NAME = 'user_data.json';
  private static _context: common.UIAbilityContext;

  static setContext(abilityContext: common.UIAbilityContext): void {
    MFLargeDataStorage._context = abilityContext;
  }

  private static getFilePath(): string {
    if (!MFLargeDataStorage._context) {
      throw new Error('Context not initialized');
    }
    return `${MFLargeDataStorage._context.filesDir}/${MFLargeDataStorage.FILE_NAME}`;
  }

  static async saveUserJson(data: object): Promise<void> {
    const filePath = MFLargeDataStorage.getFilePath();
    const jsonStr = JSON.stringify(data);
    try {
      const file = await fs.open(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
      await fs.write(file.fd, jsonStr);
      await fs.close(file.fd);
    } catch (err) {
      ConsoleLog.error(`[MFLargeDataStorage] save error: ${(err as BusinessError).message}`);
    }
  }

  static async saveUserJsonString(jsonStr: string): Promise<void> {
    const filePath = MFLargeDataStorage.getFilePath();
    try {
      const file = await fs.open(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
      await fs.write(file.fd, jsonStr);
      await fs.close(file.fd);
    } catch (err) {
      ConsoleLog.error(`[MFLargeDataStorage] save error: ${(err as BusinessError).message}`);
    }
  }

  static async loadUserJson(): Promise<string> {
    const filePath = MFLargeDataStorage.getFilePath();
    try {
      if (!await fs.access(filePath)) {
        return "";
      }
      const file = await fs.open(filePath, fs.OpenMode.READ_ONLY);
      const stat = await fs.stat(filePath);
      const buf = new ArrayBuffer(stat.size);
      await fs.read(file.fd, buf);
      await fs.close(file.fd);
      // 使用buffer模块的from和toString方法
      const str = buffer.from(buf).toString('utf-8');
      return str;
    } catch (err) {
      ConsoleLog.error(`[MFLargeDataStorage] load error: ${(err as BusinessError).message}`);
      return "";
    }
  }
}

export default MFLargeDataStorage;

3.使用示例

TypeScript 复制代码
import common from '@ohos.app.ability.common';
import ConsoleLog from '../support/extension/ConsoleLog';
import MFLargeDataStorage from '../support/data/MFLargeDataStorage';

interface UserItem {
  name: string;
  age: number;
}

@Entry
@Component
struct Index {
  private context = getContext(this) as common.UIAbilityContext;

  aboutToAppear() {
    if (!this.context) {
      ConsoleLog.error('无效的上下文对象');
      return;
    }
    MFLargeDataStorage.setContext(this.context);
  }

  build() {
    RelativeContainer() {
      Column() {
        Button('保存大文件')
          .onClick(async () => {
            const userData: UserItem = { name: "张三", age: 25 };
            try {
              await MFLargeDataStorage.saveUserJson(userData);
            } catch (err) {
              ConsoleLog.error('保存失败:', err);
            }
          })

        Button('获取大文件')
          .onClick(async () => {
            const loadedData = await MFLargeDataStorage.loadUserJson();
            ConsoleLog.log(loadedData); // 输出: {name: "张三", age: 25}
          })
      }
    }
    .height('100%')
    .width('100%')
  }
}
相关推荐
芒鸽2 天前
HarmonyOS ArkTS 状态管理深度解析:@State、@Prop、@Link、@Provide/@Consume 实战指南
华为·harmonyos·arkts·状态管理
三声三视2 天前
Electron 窗口状态保存,我在鸿蒙 PC 上放弃了 electron-store
electron·arkts·鸿蒙
递归4048 天前
ofdkit-harmony 0.2.0 发布:鸿蒙原生 OFD 阅读库,已上架 ohpm
开源·harmonyos·arkts·ofd·ohpm
大雷神9 天前
HarmonyOS APP<<古今职鉴定>>开源教程第26篇:【完整案例】职业性格测试开发
harmonyos·arkts·鸿蒙·古今职鉴
大师兄666818 天前
HarmonyOS 卡片 UI 三种玩法:普通卡片、动效卡片、Canvas 卡片
harmonyos·arkts·formkit·动效卡片·canvas卡片
UnicornDev1 个月前
【HarmonyOS 6】底部悬浮导航的迷你栏适配(API23)
华为·harmonyos·arkts·鸿蒙
笔触狂放1 个月前
【项目】基于ArkTS的老年人智能应用开发(1)
harmonyos·arkts·鸿蒙
UnicornDev1 个月前
【HarmonyOS 6】底部悬浮导航的沉浸光感适配(API23)
华为·harmonyos·arkts·鸿蒙·鸿蒙系统
UnicornDev1 个月前
【HarmonyOS 6】设置页面 UI 设计
ui·华为·harmonyos·arkts·鸿蒙
UnicornDev1 个月前
【HarmonyOS 6】基于API23的底部悬浮导航
华为·harmonyos·arkts·鸿蒙·鸿蒙系统