2013-03-26 1 views
7

Ich habe eine Zip-Datei in die Android-Assets eingefügt. Wie extrahiere ich die Datei im internen Android-Speicher? Ich weiß, wie man die Datei bekommt, aber ich weiß nicht, wie ich sie extrahiere. Dies ist mein Code ..Datei in Android-Assets entpacken

Util zip ;

zip = new Util();

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

Danke für die Hilfe: D

+0

welches Problem u bekommen? wo möchten Sie Zip-Datei im internen Speicher oder External Storage extrahieren? –

+0

Sie wissen, dass Assets ohnehin von Android-Tools gezippt werden. Sie führen also eine doppelte Komprimierung durch, indem Sie eine Zip-Datei einfügen. Wenn Sie die Dateien zusammenfassen möchten, könnten Sie Folgendes tun: Verwenden Sie tar? Zipper ohne Kompression machen? Wenn das Bündeln nicht das Ziel ist, platzieren Sie die Dateien einfach und überlassen Sie die Komprimierung Android Toolchain. – akauppi

Antwort

14

Dieses Stück Code wird Ihnen helfen .... Übergeben Sie einfach die ZIP-Datei und den Speicherort, wo die extrahierten Dateien in dieser Klasse gespeichert werden sollen, während Sie ein Objekt erstellen ... und rufen Sie die Methode unzip auf ...

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(); 
    } 
    } 
} 
+0

Danke. Es funktionierte: D – kyuu

+0

Glücklich, Ihnen zu helfen, wenn es funktioniert, unterstützen Sie mich durch Upvoting .... –

+0

Hallo ich habe es versucht, eine Datei von 20mb zu entpacken und es dauert eine lange Zeit. –

1

Vielleicht sollten Sie versuchen, eine Outputstream in Kombination mit einem Eingabestrom aus der Verwendung zip-Datei. Mit einer Paketdatei sollte dies funktionieren.

zitieren @wordy von 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); 
} 

Sieht aus wie es mit ProGuard sein Probleme können Sie aber hoffentlich funktioniert das Codebeispiel.

0

Ich habe noch nicht getestet, aber während ich ein Projekt auf OCR, stieß ich auf diese library, wo es eine Methode zum Entpacken einer heruntergeladenen Datei aus dem Netz gibt. Die genaue Methode zum Entpacken der Datei ist installZipFromAssets(String sourceFilename,File destinationDir,File destinationFile) gefunden unter dieser class .Hope das ist, was Sie suchen

0

Sie können auch die zip4j externe Bibliothek verwenden, die zusätzliche Funktionen wie Verschlüsselung bietet. Außerdem verfügt es über Funktionen zum Extrahieren von Dateien an einen bestimmten Ort, sofern der Pfad angegeben wurde.

5

Basierend auf Sreedev R-Lösung hinzugefügt ich die Möglichkeit, die Datei von Vermögenswerten und Nutzungspuffer zu lesen:

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()); 
      } 
     } 
    } 
}