public class ZipUtils {
public static final String TAG = "ZIP";
public ZipUtils() {
}
/**
* 解压zip到指定的路径
*
* @param zipFileString ZIP的名称
* @param outPathString 要解压缩路径
* @throws Exception
*/
public void UnZipFolder(String zipFileString, String outPathString,UnZipListener unZipListener) {
ZipInputStream inZip = null;
FileOutputStream out = null;
try {
inZip= new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
long sumTotalLength = 0;
// 获取解压之后文件的大小,用来计算解压的进度
long ziplength = getZipTrueSize(zipFileString);
System.out.println("压缩包大小:" + ziplength);
while ((zipEntry = inZip.getNextEntry()) != null) {
sumTotalLength = unZipFile(zipEntry, outPathString, inZip, out, sumTotalLength, ziplength, unZipListener);
}
inZip.close();
if(unZipListener!=null)
unZipListener.onSuccess();
} catch (Exception e) {
e.printStackTrace();
if(unZipListener!=null){
unZipListener.onError(e.getMessage());
}
try {
if(inZip!=null)
inZip.close();
} catch (Exception e1) {
e1.printStackTrace();
}
try {
if(out!=null)
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
/**
* 解压单个文件
* @param zipEntry 解压的单个文件
* @param outPathString 解压保存路径
* @param inZip zip 输入流
* @param out zip 输出流
* @param sumTotalLength 解压 总长度
* @param ziplength zip 总长度
* @param unZipListener 监听回调
* @throws IOException
*/
private long unZipFile(ZipEntry zipEntry, String outPathString, ZipInputStream inZip, FileOutputStream out,
long sumTotalLength, long ziplength, UnZipListener unZipListener) throws IOException {
System.out.println("\r");
System.out.println("\r");
System.out.println("\r");
String szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
// System.out.println("读取文件:" + outPathString + File.separator + szName);
File file = new File(outPathString + File.separator + szName);
if (!file.exists()) {
// Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
file.getParentFile().mkdirs();
file.createNewFile();
}
long fileSize = zipEntry.getSize();
// 获取文件的输出流
out= new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
long sumLength = 0;
long lastCurProgress = 0;
//如果zip包大小为0时Ui只更新一次
boolean isUpdateProgress = false;
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -1) {
if (unZipListener != null) {
if (ziplength != 0) {
sumLength += len;
sumTotalLength += len;
int totalProgress = (int) ((sumTotalLength * 100) / ziplength);
int curProgress;
if (fileSize != 0) {
curProgress = (int) ((sumLength * 100) / fileSize);
System.out.println("文件:" + szName + " 读取长度:" + len + " ,进度值:" + curProgress + " ,总进度:" + totalProgress + " ,总长度:" + fileSize);
if (fileSize < 1024 * 100) {
if (curProgress > 10) {
unZipListener.onUnZipFileProgress(szName, curProgress, totalProgress);
}
// if (curProgress > lastCurProgress) { //避免重复刷新UI
// lastCurProgress = curProgress;
//
// }
} else {
if (curProgress > lastCurProgress) { //避免重复刷新UI
lastCurProgress = curProgress;
// unZipListener.onUnZipFileProgress(szName, curProgress, totalProgress);
}
}
} else {
curProgress = 100;
if (curProgress > lastCurProgress) { //避免重复刷新UI
lastCurProgress = curProgress;
// unZipListener.onUnZipFileProgress(szName, curProgress, totalProgress);
}
}
} else {
if (!isUpdateProgress) {
unZipListener.onUnZipFileProgress(szName, 100, 100);
isUpdateProgress = true;
}
}
}
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
return sumTotalLength;
}
/**
* 获取zip 压缩包大小
* @param filePath 文件路径
* @return 文件大小
*/
public long getZipTrueSize(String filePath) {
long size = 0;
ZipFile f;
try {
f = new ZipFile(filePath);
Enumeration<? extends ZipEntry> en = f.entries();
while (en.hasMoreElements()) {
size += en.nextElement().getSize();
}
} catch (IOException e) {
e.printStackTrace();
}
return size;
}
public interface UnZipListener {
void onSuccess();
void onError(String reason);
void onUnZipFileProgress(String name, int progress, int totalProgress);
}
}
我现在其实已经实现了,zip解压进度显示,可是当遇到小文件时,进度更新速度太快,无法看清楚解压缩的具体哪个文件了,我想如何让小文件 进度值更新的慢一些
信息放 list里,就能看到了