[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%')
  }
}
相关推荐
Thanks_ks4 天前
Docker 疑难杂症解决指南:从入门到进阶的全面剖析
数据持久化·性能调优·docker 疑难杂症·镜像构建优化·容器网络配置·docker 安全加固·容器运维技巧
高心星5 天前
鸿蒙5.0项目开发——鸿蒙天气项目的实现(介绍)
arkts·arkui·鸿蒙项目·harmonyos5.0·鸿蒙天气
马剑威(威哥爱编程)8 天前
HarmonyOS 5.0 分布式数据协同与跨设备同步
分布式·华为·harmonyos·arkts·harmonyos-next
DONSEE广东东信智能读卡器8 天前
鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK
二次开发·sdk·arkts·鸿蒙·身份证阅读器·社保卡读卡器
_waylau9 天前
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
人工智能·华为·harmonyos·arkts·鸿蒙·仓颉
搞瓶可乐10 天前
鸿蒙ArkTs实战之截图保存图片到相册,详细教程,不使用SaveButton的方法,附上源码和效果图
华为·harmonyos·arkts·保存图片·操作沙箱·鸿蒙解决方案·媒体操作
叫我王富贵i12 天前
0基础学习鸿蒙开发-HarmonyOS4
学习·华为·harmonyos·arkts
编程在手天下我有20 天前
Redis 常见问题深度剖析与全方位解决方案指南
数据库·redis·缓存·性能优化·数据持久化·分布式系统
鸿蒙布道师21 天前
鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei