【鸿蒙实战开发】基于原生能力的压缩与解压缩能力

一、场景描述

概览、常用图片编码格式比对及系统支持情况

压缩格式 简介 系统支持/使用方式
zip 普及率高,适用范围也最广,压缩速度相比rar快一些 ArkTs支持,可通过zlib实现,jszip
rar rar格式比zip更能够提供较好的压缩率,但压缩速度也相对慢一些 三方库支持,通过Unrar实现
7z 压缩率相对前两种最大,但速度也最慢 三方库支持,通过commons-compress实现
brotli 无损压缩算法,主要目标是压缩 Internet 上的数据 三方库支持,通过commons-compress实现
tar 简单封装,被称为归档文件,只是简单的将文件组装到一个.tar的文件内,并没有太多文件体积的减少,仅仅是简单的封装 三方库支持,通过commons-compress实现
gzip .gz:使用gzip算法将文件压缩到一个文件,极大的减少压缩后的体积 三方库支持,通过三方库pako实现

ArkTs侧:

场景一:压缩与解压rawfile目录下的文件,由于在resource/rawfile目录下存放的文件,没有对外暴露的沙箱路径,无法使用文件管理接口或以沙箱路径形式处理,因此需要将rawfile下文件通过fs拷贝进沙箱目录下,再使用 zlib 进行压缩与解压。

场景二:压缩与解压resfile下的文件,通过getContext().resourceDir获取到该路径下的文件,再使用zlib进行压缩与解压。

Native侧:

当前鸿蒙暂无native的压缩与解压接口,本文主要介绍native侧通过zlib实现压缩与解压。

二、方案描述

ArkTs侧

方案

1)通过resourceManager.getRawFileContent获取到rawfile下的文件;

2)然后通过fs将rawfile文件内容copy到沙箱路径;

3)最后使用zlib.decompressFile对沙箱路径下的压缩文件进行解压。

效果图

核心代码

function resfileZlibDecompress() {

getContext().resourceManager.getRawFileContent('file1.zip', (_err, value) => {

//将rawfile下的文件拷贝至沙箱下,沙箱路径:/data/storage/el2/base/haps/entry/filesfile1.zip

let myBuffer: ArrayBufferLike = value.buffer

let filePath = getContext().filesDir + "file1.zip";

let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

let writeLen = fs.writeSync(file.fd, myBuffer);

fs.closeSync(file);

let outFileDir = getContext().filesDir;

let options: zlib.Options = {

level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION

};

//解压沙箱下的文件

try {

zlib.decompressFile(filePath, outFileDir, options, (errData: BusinessError) => {

if (errData !== null) {

console.error(`errData 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值