Unzip the file in Android assets

I put the zip file in Android assets. How to extract a file in Android internal storage? I know how to get a file, but I don't know how to extract it. This is my code.

Util zip ;

zip = new Util();

zip.copyFileFromAsset(this, "myfile.zip", getExternalStorage()+ "/android/data/edu.binus.profile/");

Thanks for the help: D

+7
source share
5 answers

This piece of code will help you ... Just pass the zipfile location and the place where you want the extracted files to be saved to this class when creating the object ... and calling the unzip method ...

  public class Decompress { private String zip; private String loc; public Decompress(String zipFile, String location) { zip = zipFile; loc = location; dirChecker(""); } public void unzip() { try { FileInputStream fin = new FileInputStream(zip); ZipInputStream zin = new ZipInputStream(fin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v("Decompress", "Unzipping " + ze.getName()); if(ze.isDirectory()) { dirChecker(ze.getName()); } else { FileOutputStream fout = new FileOutputStream(loc + ze.getName()); for (int c = zin.read(); c != -1; c = zin.read()) { fout.write(c); } zin.closeEntry(); fout.close(); } } zin.close(); } catch(Exception e) { Log.e("Decompress", "unzip", e); } } private void dirChecker(String dir) { File f = new File(_location + dir); if(!f.isDirectory()) { f.mkdirs(); } } } 
+14
source

Based on the Sreedev R solution, I added a parameter to read the file from assets and use the buffer:

 package com.pixoneye.api.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.content.Context; import android.util.Log; public class Decompress { private static final int BUFFER_SIZE = 1024 * 10; private static final String TAG = "Decompress"; public static void unzipFromAssets(Context context, String zipFile, String destination) { try { if (destination == null || destination.length() == 0) destination = context.getFilesDir().getAbsolutePath(); InputStream stream = context.getAssets().open(zipFile); unzip(stream, destination); } catch (IOException e) { e.printStackTrace(); } } public static void unzip(String zipFile, String location) { try { FileInputStream fin = new FileInputStream(zipFile); unzip(fin, location); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void unzip(InputStream stream, String destination) { dirChecker(destination, ""); byte[] buffer = new byte[BUFFER_SIZE]; try { ZipInputStream zin = new ZipInputStream(stream); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v(TAG, "Unzipping " + ze.getName()); if (ze.isDirectory()) { dirChecker(destination, ze.getName()); } else { File f = new File(destination + ze.getName()); if (!f.exists()) { FileOutputStream fout = new FileOutputStream(destination + ze.getName()); int count; while ((count = zin.read(buffer)) != -1) { fout.write(buffer, 0, count); } zin.closeEntry(); fout.close(); } } } zin.close(); } catch (Exception e) { Log.e(TAG, "unzip", e); } } private static void dirChecker(String destination, String dir) { File f = new File(destination + dir); if (!f.isDirectory()) { boolean success = f.mkdirs(); if (!success) { Log.w(TAG, "Failed to create folder " + f.getName()); } } } } 
+5
source

Perhaps you should try using FileOutputStream in combination with the input stream from a zip file. This should work with the package file.

To quote @wordy from this question :

 PackageManager pm = context.getPackageManager(); String apkFile = pm.getApplicationInfo(context.getPackageName(), 0).sourceDir; ZipFile zipFile = new ZipFile(apkFile); ZipEntry entry = zipFile.getEntry("assets/FILENAME"); myInput = zipFile.getInputStream(entry); myOutput = new FileOutputStream(file); byte[] buffer = new byte[1024*4]; int length; int total = 0; int counter = 1; while ((length = myInput.read(buffer)) > 0) { total += length; counter++; if (counter % 32 == 0) { publishProgress(total); } myOutput.write(buffer, 0, length); } 

It sounds like there might be problems with ProGuard, but hopefully a sample code works for you.

+1
source

I have not tested it yet, but while running the project on OCR , I came across this library , where there is a way to unpack the downloaded file from the network. The exact method of unpacking the installZipFromAssets(String sourceFilename,File destinationDir,File destinationFile) file installZipFromAssets(String sourceFilename,File destinationDir,File destinationFile) found in this class . Hope this is what you are looking for

0
source

You can also use the external zip4j library, which provides additional features such as encryption. In addition, it has functions for extracting files to a specific location specified in the path.

0
source

All Articles