import android.content.Context; import android.util.Log; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipUtils { public static final String TAG="ZIP"; public ZipUtils(){ } /** * 解壓zip到指定的路徑 * @param zipFileString ZIP的名稱 * @param outPathString 要解壓縮路徑 * @throws Exception */ public static void UnZipFolder(String zipFileString, String outPathString , Context context) throws Exception { ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString)); ZipEntry zipEntry; String szName = ""; while ((zipEntry = inZip.getNextEntry()) != null) { szName = zipEntry.getName(); if (zipEntry.isDirectory()) { //獲取部件的文件夾名 szName = szName.substring(0, szName.length() - 1); File folder = new File(outPathString + File.separator + szName); folder.mkdirs(); } else { Log.e(TAG,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(); } // 獲取文件的輸出流 FileOutputStream out = new FileOutputStream(file); int len; byte[] buffer = new byte[1024]; // 讀取(字節)字節到緩衝區 while ((len = inZip.read(buffer)) != -1) { // 從緩衝區(0)位置寫入(字節)字節 out.write(buffer, 0, len); out.flush(); } out.close(); } } inZip.close(); } public static void UnZipFolder(String zipFileString, String outPathString, String szName) throws Exception { ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString)); ZipEntry zipEntry; while ((zipEntry = inZip.getNextEntry()) != null) { //szName = zipEntry.getName(); if (zipEntry.isDirectory()) { //獲取部件的文件夾名 szName = szName.substring(0, szName.length() - 1); File folder = new File(outPathString + File.separator + szName); folder.mkdirs(); } else { Log.e(TAG,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(); } // 獲取文件的輸出流 FileOutputStream out = new FileOutputStream(file); int len; byte[] buffer = new byte[1024]; // 讀取(字節)字節到緩衝區 while ((len = inZip.read(buffer)) != -1) { // 從緩衝區(0)位置寫入(字節)字節 out.write(buffer, 0, len); out.flush(); } out.close(); } } inZip.close(); } /** * 壓縮文件和文件夾 * @param srcFileString 要壓縮的文件或文件夾 * @param zipFileString 解壓完成的Zip路徑 * @throws Exception */ public static void ZipFolder(String srcFileString, String zipFileString)throws Exception { //建立ZIP ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString)); //建立文件 File file = new File(srcFileString); //壓縮 ZipFiles(file.getParent()+ File.separator, file.getName(), outZip); //完成和關閉 outZip.finish(); outZip.close(); } /** * 壓縮文件 * @param folderString * @param fileString * @param zipOutputSteam * @throws Exception */ private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam)throws Exception { if(zipOutputSteam == null) return; File file = new File(folderString+fileString); if (file.isFile()) { ZipEntry zipEntry = new ZipEntry(fileString); FileInputStream inputStream = new FileInputStream(file); zipOutputSteam.putNextEntry(zipEntry); int len; byte[] buffer = new byte[4096]; while((len=inputStream.read(buffer)) != -1) { zipOutputSteam.write(buffer, 0, len); } zipOutputSteam.closeEntry(); } else { //文件夾 String fileList[] = file.list(); //沒有子文件和壓縮 if (fileList.length <= 0) { ZipEntry zipEntry = new ZipEntry(fileString+ File.separator); zipOutputSteam.putNextEntry(zipEntry); zipOutputSteam.closeEntry(); } //子文件和遞歸 for (int i = 0; i < fileList.length; i++) { ZipFiles(folderString, fileString+ File.separator+fileList[i], zipOutputSteam); } } } /** * 返回zip的文件輸入流 * @param zipFileString zip的名稱 * @param fileString ZIP的文件名 * @return InputStream * @throws Exception */ public static InputStream UpZip(String zipFileString, String fileString)throws Exception { ZipFile zipFile = new ZipFile(zipFileString); ZipEntry zipEntry = zipFile.getEntry(fileString); return zipFile.getInputStream(zipEntry); } /** * 返回ZIP中的文件列表(文件和文件夾) * @param zipFileString ZIP的名稱 * @param bContainFolder 是否包含文件夾 * @param bContainFile 是否包含文件 * @return * @throws Exception */ public static List<File> GetFileList(String zipFileString, boolean bContainFolder, boolean bContainFile)throws Exception { List<File> fileList = new ArrayList<File>(); ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString)); ZipEntry zipEntry; String szName = ""; while ((zipEntry = inZip.getNextEntry()) != null) { szName = zipEntry.getName(); if (zipEntry.isDirectory()) { // 獲取部件的文件夾名 szName = szName.substring(0, szName.length() - 1); File folder = new File(szName); if (bContainFolder) { fileList.add(folder); } } else { File file = new File(szName); if (bContainFile) { fileList.add(file); } } } inZip.close(); return fileList; } }
使用:java
// 須要解壓的文件 String zipFileName = Environment.getExternalStorageDirectory().getPath() + "/xxxx/resource/"+fileName; // 解壓到的目錄位置 String zipToFilePath = Environment.getExternalStorageDirectory().getPath() + "/xxxx/"+fileName; // 解壓指定文件到指定目錄 ,成功後刪除 try { ZipUtils.UnZipFolder(zipFileName, zipToFilePath,getActivity()); hasDowmResourceNum++; // 已經下載完成的資源個數+1 } catch (Exception e) { e.printStackTrace(); Log.i("xqxinfo","e:"+e.getMessage().toString()); hasDowmErrorResourceNum++; // 下載失敗的資源個數+1 }