android 压缩大小 打包_Android ZIP 打包

假设 文件/文件夹 分布如下:

dir0/file0

dir0/dir1/file1

dir0/dir2/file2

可以用递归遍历所有文件并打包,那么压缩包结构为:

zip/file0

zip/file1

zip/file2

如果想维持原来的 文件/文件夹 分布结构,即期望的压缩包结构为:

zip/dir0/file0

zip/dir0/dir1/file1

zip/dir0/dir2/file2

那么就要注意 绝对路径 与 相对路径 的问题,下面是参考代码:

/*

* Usage: zipDirectory("/sdcard/resource", "/sdcard/log.zip");

*/

public static boolean zipDirectory(String sourcePath, String zipFilePath) {

final int BUFFER = 2048;

File sourceFile = new File(sourcePath);

try {

BufferedInputStream bufferedInputStream = null;

FileOutputStream fileOutputStream = new FileOutputStream(zipFilePath);

ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(

fileOutputStream));

if (sourceFile.isDirectory()) {

zipSubDirectory(zipOutputStream, sourceFile, sourceFile.getParent().length());

} else {

byte data[] = new byte[BUFFER];

FileInputStream fileInputStream = new FileInputStream(sourcePath);

bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);

ZipEntry zipEntry = new ZipEntry(getLastPathComponent(sourcePath));

zipOutputStream.putNextEntry(zipEntry);

int count;

while ((count = bufferedInputStream.read(data, 0, BUFFER)) != -1) {

zipOutputStream.write(data, 0, count);

}

}

zipOutputStream.close();

} catch (Exception e) {

e.printStackTrace();

return false;

}

return true;

}

/*

* Zips a subfolder

*/

private static void zipSubDirectory(ZipOutputStream zipOutputStream,

File directory,

int basePathLength)

throws IOException {

final int BUFFER = 2048;

File[] fileList = directory.listFiles();

BufferedInputStream bufferedInputStream = null;

for (File file : fileList) {

if (file.isDirectory()) {

zipSubDirectory(zipOutputStream, file, basePathLength);

} else {

byte data[] = new byte[BUFFER];

String unmodifiedFilePath = file.getPath();

String relativePath = unmodifiedFilePath

.substring(basePathLength);

FileInputStream fileInputStream = new FileInputStream(unmodifiedFilePath);

bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);

ZipEntry zipEntry = new ZipEntry(relativePath);

zipOutputStream.putNextEntry(zipEntry);

int count;

while ((count = bufferedInputStream.read(data, 0, BUFFER)) != -1) {

zipOutputStream.write(data, 0, count);

}

bufferedInputStream.close();

}

}

}

/*

* gets the last path component Example:

* getLastPathComponent("/sdcard/fileToZip"); Result: "fileToZip"

*/

public static String getLastPathComponent(String filePath) {

String[] segments = filePath.split("/");

String lastPathComponent = segments[segments.length - 1];

return lastPathComponent;

}

代码写得比较潦草,先凑合着用吧,有闲的时候再优化一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值