介绍
compress4cj 库定义了一个用于多种文件的压缩(打包)和解压缩(解包)的工具库, 主要包括存档格式 RAR、TAR、ZIP格式, 流式包含bzip2、gzip、zlib、deflate格式的压缩/解压功能,只支持RAR4.0文件解压功能。
特性
- 💡 支持rar4.0格式文件的解压功能
- 💡 支持bzip2,提供公共的压缩和解压缩接口
- 💡 支持gzip,提供公共的压缩和解压缩接口
- 💡 支持deflate,提供公共的压缩和解压缩接口
- 💡 整合标准库的zlib包 提供公共的压缩和解压缩接口
- 💡 整合zip4cj,提供公共的压缩和解压缩接口
- 💡 支持tar,提供公共的打包和解包接口
软件架构
架构图
架构图文字说明,包括模块说明、架构层次等详细说明。
源码目录
/compress4cj # 三方库源代码
├── doc # 文档
│ ├── assets
│ ├── design.md
│ └── feature_api.md # api接口文档
├── src
│ ├── archivers
│ │ ├── rar # rar源码组件目录
│ │ ├── tar # tar源码组件目录
│ │ └── zip # zip源码组件目录
│ ├── compressors
│ │ ├── bzip2 # bzip2源码组件目录
│ │ ├── deflate # deflate源码组件目录
│ │ ├── gzip # gzip源码组件目录
│ │ └── zlib # zlib源码组件目录
│ └── utils # 工具源码组件目录
├── test
│ ├── doc # README文档示例目录
│ ├── FUZZ # fuzz测试用例目录
│ ├── HLT # HLT测试用例目录
│ ├── LLT # LLT测试用例目录
│ └── resources # HLT和LLT测试文件目录
├── CHANGELOG.md
├── LICENSE.txt
├── module.json
├── README.md
└── README.OpenSource
doc
存放库的设计文档、使用文档src
是库源码目录test
存放 DOC 演示样例、fuzz 测试用例、HLT 测试用例、LLT 自测用例和 resources 测试用例使用文件
接口说明
主要类和函数接口说明详见 API
使用说明
编译构建
windows 编译过程:
cjpm update
cjpm build
windows 测试过程:
set Path=%构建build目录%;%Path%
cjc -O2 --import-path %构建build目录% -L %构建build目录%/compress4cj -L %构建build目录%/charset -l compress4cj_archivers -l compress4cj_archivers.rar.crc -l compress4cj_archivers.rar -l compress4cj_archivers.rar.exception -l compress4cj_archivers.rar.io -l compress4cj_archivers.rar.rarfile -l compress4cj_archivers.rar.unpack.decode -l compress4cj_archivers.rar.unpack -l compress4cj_archivers.rar.unpack.ppm -l compress4cj_archivers.rar.unpack.vm -l compress4cj_archivers.rar.unsigned -l compress4cj_archivers.rar.volume -l compress4cj_archivers.support -l compress4cj_archivers.tar -l compress4cj_archivers.zip -l compress4cj_compressors.bzip2 -l compress4cj_compressors.deflate -l compress4cj_compressors -l compress4cj_compressors.gzip -l compress4cj_compressors.support -l compress4cj_compressors.zlib -l compress4cj_utils -l compress4cj_utils.externals -l compress4cj_utils.internals -l compress4cj_utils.nio -l charset_charset -l charset_charset.encoding -l charset_charset.japanese -l charset_charset.korean -l charset_charset.simplechinese -l charset_charset.singlebyte -l charset_charset.traditionchinese -l charset_charset.unicode xxxx.cj -o xxxx.cj.exe
:: 需要将依赖库的.dll文件和.cjo文件复制到.exe当前目录下
:: 执行exe
xxxx.cj.exe
linux 编译过程:
cjpm update
cjpm build
linux 测试过程:
export LD_LIBRARY_PATH=${构建build目录}:${LD_LIBRARY_PATH}
cjc -O2 --import-path ${构建build目录} -L ${构建build目录}/compress4cj -L ${构建build目录}/charset -l compress4cj_archivers -l compress4cj_archivers.rar.crc -l compress4cj_archivers.rar -l compress4cj_archivers.rar.exception -l compress4cj_archivers.rar.io -l compress4cj_archivers.rar.rarfile -l compress4cj_archivers.rar.unpack.decode -l compress4cj_archivers.rar.unpack -l compress4cj_archivers.rar.unpack.ppm -l compress4cj_archivers.rar.unpack.vm -l compress4cj_archivers.rar.unsigned -l compress4cj_archivers.rar.volume -l compress4cj_archivers.support -l compress4cj_archivers.tar -l compress4cj_archivers.zip -l compress4cj_compressors.bzip2 -l compress4cj_compressors.deflate -l compress4cj_compressors -l compress4cj_compressors.gzip -l compress4cj_compressors.support -l compress4cj_compressors.zlib -l compress4cj_utils -l compress4cj_utils.externals -l compress4cj_utils.internals -l compress4cj_utils.nio -l charset_charset -l charset_charset.encoding -l charset_charset.japanese -l charset_charset.korean -l charset_charset.simplechinese -l charset_charset.singlebyte -l charset_charset.traditionchinese -l charset_charset.unicode xxxx.cj -o xxxx.cj.out
./xxxx.cj.out
功能示例
rar 模块解压rar文件功能实例, 方式一
功能示例描述:
import std.fs.*
import std.os.posix.*
import compress4cj.utils.externals.*
import compress4cj.archivers.*
import compress4cj.*
main () {
let input: File = File("./test/resources/MobaXterm_Portable_v22.1_1.rar", Open(true, false))
let cis: ArchiveInputStream = ArchiveStreamFactory.DEFAULT.createArchiveInputStream("rar", input)
IOUtils.copy(cis, getcwd())
}
执行结果如下:
2023/08/22 23:25:40.917096 INFO Logger extracting: MobaXterm_Portable_v22.1\CygUtils.plugin
2023/08/22 23:25:43.893536 INFO Logger extracting: MobaXterm_Portable_v22.1\MobaXterm_Personal_22.1.exe
2023/08/22 23:25:45.550802 INFO Logger extracting: MobaXterm_Portable_v22.1
rar 模块解压rar文件功能实例, 方式二
import std.fs.*
import std.os.posix.*
import compress4cj.utils.externals.*
import compress4cj.archivers.*
import compress4cj.*
main () {
Junrar.extract("./test/resources/MobaXterm_Portable_v22.1_1.rar", getcwd())
return 0
}
执行结果如下:
2023/08/22 23:25:40.917096 INFO Logger extracting: MobaXterm_Portable_v22.1\CygUtils.plugin
2023/08/22 23:25:43.893536 INFO Logger extracting: MobaXterm_Portable_v22.1\MobaXterm_Personal_22.1.exe
2023/08/22 23:25:45.550802 INFO Logger extracting: MobaXterm_Portable_v22.1
zip 整合接口 功能示例
功能示例描述:
示例代码如下:
import compress4cj.archivers.*
import compress4cj.*
import compress4cj.archivers.zip.*
import compress4cj.utils.externals.*
import compress.zlib.*
import std.fs.*
import std.os.posix.*
main() {
zipTest()
unZipTest()
return 0
}
func zipTest() {
let input1: File = File("test1.xml", Open(true, true))
let input2: File = File("test2.xml", Open(true, true))
let ouput: File = File("bla.zip", CreateOrTruncate(true))
let cos: ArchiveOutputStream = ArchiveStreamFactory.DEFAULT.createArchiveOutputStream("zip", ouput)
IOUtils.copy(input1, cos)
IOUtils.copy(input2, cos)
cos.flush()
}
func unZipTest() {
var path2: String = getcwd()
let input: File = File("bla.zip", Open(true, true))
let ais: ArchiveInputStream = ArchiveStreamFactory.DEFAULT.createArchiveInputStream("zip", input)
let path: String = "${path2}/testZipFile02/"
IOUtils.copy(ais, path)
}
执行结果如下:
2023/09/25 01:07:14.932315 INFO Logger test1.xml解压完成
2023/09/25 01:07:14.932521 INFO Logger test2.xml解压完成
zlib 整合接口 功能示例
功能示例描述:
示例代码如下:
import compress4cj.compressors.*
import compress4cj.compressors.zlib.*
import compress4cj.*
import compress4cj.utils.externals.*
import compress.zlib.*
import std.fs.*
import std.io.*
main() {
testZlibCreation()
testZlibUnarchiveno()
return 0
}
func testZlibCreation() {
let input: File = File("test1.xml", Open(true, true))
let ouput: File = File("test111.xml.zlib", CreateOrTruncate(true))
let cos: CompressorOutputStream = CompressorStreamFactory().createCompressorOutputStream("zlib", ouput)
IOUtils.copy(input, cos)
}
func testZlibUnarchiveno() {
let input: File = File("oktest.xml.zlib", Open(true, true))
let output: File = File("ok.xml", CreateOrTruncate(true))
let inp: CompressorInputStream = CompressorStreamFactory().createCompressorInputStream("zlib", input)
IOUtils.copy(inp, output)
}
执行结果如下:
0
tar模块打包功能实例,实现方式一
功能示例描述:
示例代码如下:
import std.io.*
import std.os.*
import std.fs.*
import std.os.posix.*
import compress4cj.archivers.tar.*
main () {
let tos = TarArchiveOutputStream(File("test.tar", CreateOrTruncate(true)))
let en1 = TarArchiveEntry("file1")
en1.setSize(25)
tos.putArchiveEntry(en1)
tos.write("this is content of file1\n".toUtf8Array())
tos.closeArchiveEntry()
let en2 = TarArchiveEntry("file2")
en2.setSize(25)
tos.putArchiveEntry(en2)
tos.write("this is content of file2\n".toUtf8Array())
tos.closeArchiveEntry()
tos.close()
println("Successfully packaged the file.")
}
执行结果如下:
Successfully packaged the file.
tar模块打包功能实例,实现方式二
示例代码如下:
import std.io.*
import std.os.*
import std.fs.*
import std.os.posix.*
import compress4cj.archivers.tar.*
import compress4cj.utils.externals.*
import compress4cj.archivers.*
import compress4cj.*
main() {
let name1 = Path("/home/liyanqing/workspace/compress/test/resources/HLT_resource/test1.xml")
let name2 = Path("/home/liyanqing/workspace/compress/test/resources/HLT_resource/test2.xml")
var output = File("./bla.tar", CreateOrTruncate(true))
let tar: ArchiveOutputStream = ArchiveStreamFactory.DEFAULT.createArchiveOutputStream(ArchiveStreamFactory.TAR, output)
tar.putArchiveEntry(TarArchiveEntry(name1, name1.fileName.getOrThrow()))
IOUtils.copy(File(name1, Open(true, false)), tar)
tar.closeArchiveEntry()
tar.putArchiveEntry(TarArchiveEntry(name2, name2.fileName.getOrThrow()))
IOUtils.copy(File(name2, Open(true, false)), tar)
tar.closeArchiveEntry()
tar.close()
println("Successfully packaged the file.")
}
执行结果如下:
Successfully packaged the file.
tar模块解档功能实例,实现方式一
功能示例描述:
示例代码如下:
import std.io.*
import std.os.*
import std.fs.*
import std.os.posix.*
import compress4cj.archivers.tar.*
import compress4cj.utils.externals.*
import compress4cj.archivers.*
import compress4cj.*
main() {
let input: File = File("./bla.tar", Open(true, true))
let ais: ArchiveInputStream = ArchiveStreamFactory.DEFAULT.createArchiveInputStream("tar", input)
IOUtils.copy(ais, getcwd())
println("Successfully unpacked the file")
}
执行结果如下:
Successfully unpacked the file
tar模块解档功能实例,实现方式二
功能示例描述:
示例代码如下:
import std.io.*
import std.os.*
import std.fs.*
import std.os.posix.*
import compress4cj.archivers.tar.*
import compress4cj.utils.externals.*
import compress4cj.archivers.*
import compress4cj.*
main() {
let tar = TarArchiveInputStream(File("./bla.tar", Open(true, false)))
let buffer = Array<Byte>(1024, item: 0)
var read = 0
while (true) {
match(tar.getNextTarEntry()) {
case None => break
case Some(v) =>
if (v.isDirectory()) {
if (!Directory.exists(v.getName())){
Directory.create(v.getName())
}
continue;
}
let outputFile = File(v.getName(), CreateOrTruncate(true))
do {
read = tar.read(buffer)
if (read <= 0) {
break
}
outputFile.write(buffer[0..read])
}
while (true)
}
}
println("Successfully unpacked the file")
}
执行结果如下:
Successfully unpacked the file
gzip 整合接口 功能示例
功能示例描述:
示例代码如下:
import compress4cj.*
import compress4cj.compressors.*
import compress4cj.compressors.gzip.*
import compress4cj.utils.externals.*
import compress.zlib.*
import std.fs.*
import std.io.*
main() {
testGzipCreation()
testGzipUnarchive()
return 0
}
func testGzipCreation() {
let input: File = File("test1.xml", Open(true, true))
let ouput: File = File("test111.xml.gz", CreateOrTruncate(true))
let cos: CompressorOutputStream = CompressorStreamFactory().createCompressorOutputStream("gz", ouput)
IOUtils.copy(input, cos)
}
func testGzipUnarchive() {
let input: File = File("bla.tgz", Open(true, true))
let output: File = File("bla.tar", CreateOrTruncate(true))
let inp: CompressorInputStream = CompressorStreamFactory().createCompressorInputStream("gz", input)
IOUtils.copy(inp, output)
}
执行结果如下:
0
deflate 整合接口 功能示例
功能示例描述:
示例代码如下:
import compress4cj.compressors.*
import compress4cj.compressors.deflate.*
import compress4cj.utils.externals.*
import compress.zlib.*
import compress4cj.*
import std.fs.*
import std.io.*
main() {
testDeflateCreation()
testDeflateUnarchiveno()
return 0
}
func testDeflateCreation() {
let input: File = File("test1.xml", Open(true, true))
let ouput: File = File("test111.xml.deflatez", CreateOrTruncate(true))
let cos: CompressorOutputStream = CompressorStreamFactory().createCompressorOutputStream("deflate", ouput)
IOUtils.copy(input, cos)
}
func testDeflateUnarchiveno() {
let input: File = File("bla.tar.deflate", Open(true, true))
let output: File = File("bla.tar", CreateOrTruncate(true))
let inp: CompressorInputStream = CompressorStreamFactory().createCompressorInputStream("deflate", input)
IOUtils.copy(inp, output)
}
执行结果如下:
0
bzip2 整合接口 功能示例
功能示例描述:
示例代码如下:
import compress4cj.compressors.*
import compress4cj.compressors.bzip2.*
import compress4cj.utils.externals.*
import compress4cj.*
import std.fs.*
main() {
let dataFile: File = File("123.txt", CreateOrTruncate(true))
dataFile.write("123".toUtf8Array())
dataFile.close()
compress1() // 压缩
compress2() // 压缩
decompress1() // 解压
decompress2() // 解压
0
}
func compress1(){
let dataFile: File = File("123.txt", Open(true, true))
let bzFile: File = File("123.bz2", CreateOrTruncate(true))
let bzOut: BZip2CompressorOutputStream = BZip2CompressorOutputStream(bzFile)
IOUtils.copy(dataFile, bzOut)
bzOut.close()
}
func compress2(){
let dataFile: File = File("123.txt", Open(true, true))
let bzFile: File = File("123.bz2", CreateOrTruncate(true))
let bzOut: CompressorOutputStream = CompressorStreamFactory().createCompressorOutputStream("bzip2", bzFile)
IOUtils.copy(dataFile, bzOut)
bzOut.close()
}
func decompress1(){
let dataFile: File = File("123.txt", CreateOrTruncate(true))
let bzFile: File = File("123.bz2", Open(true, true))
let bzIn: BZip2CompressorInputStream = BZip2CompressorInputStream(bzFile)
IOUtils.copy(bzIn, dataFile)
}
func decompress2(){
let dataFile: File = File("123.txt", CreateOrTruncate(true))
let bzFile: File = File("123.bz2", Open(true, true))
let bzIn: CompressorInputStream = CompressorStreamFactory().createCompressorInputStream("bzip2", bzFile)
IOUtils.copy(bzIn, dataFile)
}
执行结果如下:
0
鸿蒙全栈开发全新学习指南
总是有很多小伙伴反馈说:鸿蒙开发不知道学习哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档给大家用来跟着学习。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
本路线共分为四个阶段:
第一阶段:鸿蒙初中级开发必备技能
第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH
第三阶段:应用开发中高级就业技术
第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH
《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:gitee.com/MNxiaona/733GH
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH
OpenHarmony 开发环境搭建
《OpenHarmony源码解析》:gitee.com/MNxiaona/733GH
搭建开发环境
系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
OpenHarmony 设备开发学习手册
项目实战开发教学:gitee.com/MNxiaona/733GH
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:
gitee.com/MNxiaona/733GH