一、实现一个回调状态的接口
public interface IProgress {
void onProgress(int progress);
void onError(String msg);
void onDone();
}
二、获取zip文件的大小
private static long getZipSize(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) {
size = 0;
}
return size;
}
三、解压文件,回调状态
public static void unZip(String filePath, String outPath,IProgress iProgress){
if(!FileUtil.getInstance().isFileExist(filePath)){
iProgress.onError("zip不存在 " + filePath);
return;
}
long zipLength = getZipSize(filePath);
ZipInputStream zipInputStream = null;
try {
zipInputStream = new ZipInputStream(new FileInputStream(filePath));
if(zipInputStream == null || zipInputStream.available() == 0){
iProgress.onError("zip错误");
return;
}
ZipEntry zipEntry;
String szName = "";
long count = 0;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
szName = zipEntry.getName();
String currentParentFile = "";
if (zipEntry.isDirectory()) {
szName = szName.substring(0, szName.length() - 1);
currentParentFile = outPath + File.separator + szName;
new File(currentParentFile).mkdirs();
} else {
File file = new File(outPath + "/" + szName);
if (!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
// 读取(字节)字节到缓冲区
while ((len = zipInputStream.read(buffer)) != -1) {
count += len;
int progress = (int)((count * 100)/zipLength) ;
iProgress.onProgress(progress);
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}
iProgress.onDone();
}catch (Exception exc){
iProgress.onError(exc.getMessage());
}finally {
try {
zipInputStream.close();
FileUtil.getInstance().deleteFile(filePath);
} catch (IOException e) {
iProgress.onError(e.getMessage());
}
}
}
四、通过以上的步骤就可以实现解压zip文件,并且回调解压的进度。
网友评论