一、“数据压缩“简介
- 数据压缩是采用某种压缩算法减少文件大小的一个过程,这个过程可能包括对源文件的编码、重组和修改等操作,该过程的主要目标是在减少文件大小的同时,确保源文件中的数据不会丢失。文件经过压缩后,应可以使用相关的解码算法生成原始文件。
- 对数据进行压缩的算法有很多种类,可以根据压缩后数据的完整性把压缩算法分为两大类:无损压缩和有损压缩。
- 无损压缩是通过删除数据中的冗余来减少原始文件大小的数据压缩方法,因此文件的实际信息不会发生改变。有损压缩是通过删除数据中的一些不相关信息来减少原始文件大小的数据压缩方法,在某些不需要完整数据文件时可以使用这种类型的压缩。相比较于无损压缩,有损压缩的文件会小很多,但是无损压缩的优点在于能够确保数据完整的同时减少文件的大小。
二、ZIP
- ZIP 是最常使用的文件压缩格式,它属于无损压缩方法。它的优点在于可以把多个源文件压缩在一起生成单个压缩文件。在 EdgerOS 中,ZIP 模块提供了 API 以支持对文件的压缩、解压缩、修改和遍历等功能。
- 使用示例:
const Zip = require('zip')
Zip.extract('b.zip', './b')
Zip.compress('c.zip', './c')
const rzip = new Zip('a.zip', 'r')
const fileCnt = rzip.count()
for (let i = 0; i < fileCnt; i++) {
rzip.open(i);
const fileBuff = rzip.read()
const file = rzip.stat()
rzip.fread('indexi.out')
rzip.close()
}
rzip.end()
const wzip = new Zip('b.zip', 'w');
wzip.open('bb.txt')
wzip.write('append content or new content string')
wzip.close()
wzip.open('cc.txt')
wzip.fwrite('./cc.txt')
wzip.close()
wzip.end()
三、Zlip
- Zlib 是一个应用广泛的无损压缩库,EdgerOS 中的 Zlib 模块在提供对内存中数据压缩和解压方法的同时,还提供了对 Gzip 文件和数据处理的 API。
① 利用 Zlib 解压和压缩
const zlib = require('zlib')
const data = 'string to compress'
const compBuffer = zlib.compress(data, 9)
const decompBuffer = zlib.decompress(data.length, compBuffer)
console.log(decompBuffer.toString())
③ 利用 Gzip 解压和压缩
- Gzip 也是一种无损的压缩方法,它主要用于压缩单个文件,当有一个很大的文件时,Gzip 比其他方法的性能更好。如果需要压缩多个文件时,则需要配合 Tar 一起使用,即先使用 Tar 把多个文件归档为一个文件,再把这个归档文件用 Gzip 进行压缩。
const { gz } = require('zlib')
const gzfile = gz.open('input.gz', 'r')
const buffer = new Buffer(1024)
while (true) {
const num = gzfile.read(buffer)
if (num > 0) {
const content = buffer.slice(0, num)
console.log(content.toString('hex'))
} else {
break
}
}
gzfile.close()
const gzwfile = gz.open('output.gz', 'w')
gzfile.write('hello gzip file!')
gzfile.close()
- Zlib 提供 API 支持以文件流的方式读取和写入 Gzip 文件:
const { gz } = require('zlib')
const fs = require('fs')
const rs = gz.createReadStream('input.tar.gz')
const ws = fs.createWriteStream('input.tar')
rs.pipe(ws)
ws.on('finish', () => console.log('decompressed!'))
const r = fs.createReadStream('input.tar')
const w = gz.createWriteStream('input.tar.gz')
r.pipe(w)
w.on('finish', () => console.log('compressed!'))