Gzip压缩和解压缩以及assets目录文件的拷贝

时间:2022-12-16 09:11:22

安卓特有的压缩方式Gzip,介绍一个Gzip的解压缩和压缩工具类:

public class GzipUtil {
/**
* gzip压缩
* @param srcFile 源文件
* @param targetFile 目标文件
*/
public static void zip(File srcFile, File targetFile) {
FileInputStream fis = null;
GZIPOutputStream gos = null;
try {
fis = new FileInputStream(srcFile);
// 往外写的时候, 用GZIPOutputStream, 直接写成压缩文件, 包装流
gos = new GZIPOutputStream(new FileOutputStream(targetFile));
byte[] buffer = new byte[1024];
int len = 0;
while((len = fis.read(buffer)) != -1) {
gos.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeQuitely(fis);
closeQuitely(gos);
}
}

/**
* 解压缩
* @param srcFile 源文件 压缩包
* @param targetFile 目标文件 普通文件
*/
public static void unzip(File srcFile, File targetFile) {
GZIPInputStream gis = null;
FileOutputStream fos = null;
try {
gis = new GZIPInputStream(new FileInputStream(srcFile));
fos = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024];
int len = 0;
while((len = gis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeQuitely(gis);
closeQuitely(fos);
}
}

/**
* 关闭流
* @param stream
*/
public static void closeQuitely(Closeable stream) {
if(stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

如何将文件压缩成Gzip格式呢,可以利用es,导入工具类,然后执行:

public class GzipToZip {
public static void main(String[] args) {
GzipUtil.zip(new File("文件名.格式名"), new File("文件名.zip"));
}
}

将压缩文件拷贝到assets文件下,然后解压到本地

// data/data/包名/files
final File targetFile = new File(getFilesDir(), "文件名.格式名");
if(!targetFile.exists()) {
new Thread(){
public void run() {
AssetManager assets = getAssets();
try {
InputStream is = assets.open("文件名.zip");
GzipUtil.unzip(is, targetFile);
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}

同居类解压方法:

/**
* 解压缩
* @param is 输入流 压缩包
* @param targetFile 目标文件 普通文件
*/
public static void unzip(InputStream is, File targetFile) {
GZIPInputStream gis = null;
FileOutputStream fos = null;
try {
gis = new GZIPInputStream(is);
fos = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024];
int len = 0;
while((len = gis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeQuitely(gis);
closeQuitely(fos);
}
}