[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%')
  }
}
相关推荐
1099054183 天前
ArkTS语言的数据类型之Array类型
arkts
贾伟康6 天前
【HarmonyOS 7新能力|066】弱网直播优化实战:从网络感知到码率、缓冲与恢复
音视频·harmonyos·arkts·网络优化·弱网直播
贾伟康8 天前
【HarmonyOS 7新能力|065】QUIC长连接实战:弱网推送、会话恢复与连接治理
harmonyos·arkts·quic·长连接·弱网优化
贾伟康8 天前
【HarmonyOS 7新能力|067】LTPO可变帧率实战:让动画流畅而静态页面省电
harmonyos·arkts·低功耗·ltpo·可变帧率
看谷秀8 天前
arkts-12 鸿蒙生态/卡片
前端·arkts
行者-全栈开发8 天前
华为云码道 CodeArts 实测:让 AI 独立开发一个鸿蒙原生专注计时应用「刻循」
harmonyos·arkts·鸿蒙·ai 编程·华为云码道·codearts 代码智能体·专注计时
威哥爱编程9 天前
HarmonyOS 7 自由多窗实战:supportWindowMode + 断点布局,大屏多任务主动接管
harmonyos·arkts
威哥爱编程9 天前
HarmonyOS 7 应用接续实战:continuable + onContinue 跨设备无缝流转,手机编辑平板接着搞
harmonyos·arkts
威哥爱编程9 天前
HarmonyOS 7 Fast Kit 算法加速实战:四大核心能力,把算力从系统里"借"出来
harmonyos·arkts
威哥爱编程9 天前
HarmonyOS 7 游戏快启实战:Graphics Accelerate Kit 内存镜像秒级启动 + 预启动,把读条变成"秒进"
harmonyos·arkts