Android Zip解壓帶進度回撥
阿新 • • 發佈:2018-12-27
public interface IProgress {
void onProgress(int progress);
void onError(String msg);
void onDone();
}
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()); } } }