[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%')
  }
}
相关推荐
半醉看夕阳9 小时前
HarmonyOS开发 ArkTS 之 var 、let、const 变量声明的剖析
typescript·harmonyos·arkts
我睡醒再说11 小时前
HarmonyOS5 运动健康app(二):健康跑步(附代码)
华为·信息可视化·harmonyos·arkts·应用开发
lucky志1 天前
探秘鸿蒙 HarmonyOS NEXT:鸿蒙定时器,简单倒计时的场景应用
arkts·harmonyos next
libo_20251 天前
HarmonyOS 5 模型瘦身验证:从200MB到5MB的剪枝后准确率回归测试
ai编程·arkts
libo_20251 天前
HarmonyOS5 分布式数据库测试:如何验证10万条数据跨设备同步的一致性
arkts
libo_20252 天前
HarmonyOS5 响应式编程内建支持:仓颉的signal与computed原语解析
arkts
libo_20252 天前
HarmonyOS5 折叠屏适配:仓颉语言的@Foldable作用域如何自动处理状态切换
arkts
libo_20252 天前
HarmonyOS5 编译期优化:仓颉的constexpr计算在布局渲染中的提速实践
arkts
libo_20252 天前
HarmonyOS5 分布式语法糖:仓颉语言中@Remote注解如何简化跨设备调用
arkts
我睡醒再说2 天前
纯血Harmony NETX 5小游戏实践:2048(附源文件)
游戏·华为·harmonyos·arkts