2013-01-08 6 views
7

Um Zip-Datei zu entpacken Ich habe Klassen aus dem Paket java.util.zip * durch Bezugnahme this verwendet und es funktioniert jedoch zum Entpacken einer Datei von 40 MB dauert 59 Sekunden. Wenn ich gleiche Zip-Datei auf iPhone-Projekt (wir entwickeln App für beide Plattformen - Android & iPone &, die Funktionalität zum Entpacken Zip-Datei & entpackten Inhalt zu SDCARD-Android oder Dokument-Verzeichnis - iPhone) haben, dauert es nur 14 Sekunden. Die iPhone App verwendet ziparchive.So entpacken Sie große Zip-Datei und schreiben Sie in weniger Zeit auf SDCARD

Also meine Frage lautet:

1.From obiges Experiment, dass es löscht & Datei Schreiboperation unzipping in Java sdcard mehr Zeit im Vergleich zu iPhone App verbraucht, also entschied ich mich unzipping C/C++ Ebene & zu verwenden Dateischreibvorgang mit NDK. Ist das die richtige Wahl?

2.Ich habe auf Google gesucht, stackoverflow & einige vorgeschlagen, minizip zu verwenden, aber es gibt keine ausreichende Hilfe zur Verwendung von Minizip in Android. Hat anyboday Minizip für Android ausprobiert?

3.I versuchte auch NDK Entwicklung für libz, um mein Ziel zu erreichen, wie Libz in NDK hinzugefügt wird, aber nicht bekommen, wie man es benutzt. Ist jemand in NDK libz versucht?

4. Gibt es ein anderes Framework in Java oder C/C++, das große Zip-Datei entpackt & schreiben Sie sie in weniger Zeit auf SDCARD?

Bitte helfen Sie mir.

Hier ist mein Java Dekomprimieren Code:

public String unzip() { 

    String result; 

    try { 

     FileInputStream fin = new FileInputStream(this.filePath); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 

     while ((ze = zin.getNextEntry()) != null) { 

      Log.v("Unzip", "Unzipping " + ze.getName()); 

      if (ze.isDirectory()) { 
       _dirChecker(ze.getName()); 
      } else { 

       // Read 16 k at a time 
       byte[] buffer = new byte[16*1024]; 
       int read; 

       FileOutputStream fout = new FileOutputStream(this.location+ "/" + ze.getName()); 

       while ((read = zin.read(buffer)) != -1) 
       { 
        fout.write(buffer, 0, read); 
       } 


       zin.closeEntry(); 
       fout.close(); 
      } 

     } 

     zin.close(); 
     result = "success"; 

    } catch (Exception e) { 
     Log.e("unzip", "unzip", e); 
     result = "failure"; 
    } 

    return result; 
} 
+3

Ich vermute, dass seine SD-Karte Teil funktioniert. Schreiben auf SD-Karten kann sehr sehr langsam sein, besonders auf Low-End-Android-Handys oder billige SD-Karten.Die Zeit zum Entpacken kann auch auf Low-End-Android-Telefonen suspekt sein, wie es bei älteren iPhones der Fall wäre, da Unziping direkt an die Prozessorgeschwindigkeit gebunden wird. –

+2

Um @RyanPoolos Vorschlag über die SD-Karte zu testen, entpacken Sie die Dateien in den internen Speicher der Apps (das Verzeichnis, das von http://developer.android.com/reference/android/content/Context.html#getFilesDir (\)) und zurückgegeben wird Schau, ob die Zeit dem iPhone näher kommt. Das Java-Zip-Paket sollte alleine ziemlich effizient sein. –

+0

Sie könnten auch die separaten Funktionen für das Entpacken und Schreiben einstellen, um zu sehen, was auf beiden Plattformen tatsächlich Zeit kostet. –

Antwort

1

Versuchen Sie, nur 40MB-Datei zu schreiben SD-Karte und verbrachte Zeit zu messen. (Fast) alle kostenlosen (oder sogar kostenpflichtigen) Implementierungen von Zip-Archiv-Support-Bibliotheken basieren auf dem gleichen Zlib-Code, der während des Entpackens die meiste Verarbeitungsgeschwindigkeit benötigt. Java-Code sollte wesentlich langsamer sein als der native, daher würde ich vorschlagen, NDK-Entpacken zu versuchen. Wenn Sie versuchen, das Archiv mit dem Komprimierungsgrad Null zu entpacken, können Sie erraten, wie viel Zeit der Entschlüsselungscode benötigt und wie viel Zeit nur für das Kopieren von Daten aufgewendet wird.

+0

Haben Sie Links oder Informationen zur Implementierung des Dekomprimierungsvorgangs auf NDK-Ebene? Mir ist bekannt, wie man NDK benutzt, aber nicht libz benutzt. – sachin003

+0

Sorry, nein, hatte keine Erfahrung damit. –

4

Der gesamte Unzip-Code endet schließlich in zlib. Es gibt keine Java-Implementierung der Deflate-Komprimierung in Android-Core-Bibliotheken.

Der einzige Grund, dass java.util.Zip langsamer sein sollte als ein "natives" unzip ist, wenn die Datei I/O schlecht ausgeführt wird, z. etwas benutzt wirklich kleine Puffer. Wenn man sich den Code anschaut, der mit der Frage verknüpft ist, passiert genau das - er operiert auf einzelnen Bytes.

Einer der Kommentare zur Lösung lieferte einen Patch, der einen 4K-Puffer verwendet. Lass das rein und schau was mit deiner Leistung passiert.

+0

Danke für Ihre Antwort, ich benutze 16 K Puffergröße, Bitte sehen Sie meine entpackten Code in Frage. – sachin003

5

Warum versuchen Sie nicht diese code.It ehrfürchtige

String zipname = "data.zip"; 
FileInputStream fis = new FileInputStream(zipname); 
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 

while ((entry = zis.getNextEntry()) != null) { 
    System.out.println("Unzipping: " + entry.getName()); 

    int size; 
    byte[] buffer = new byte[2048]; 

    FileOutputStream fos = new FileOutputStream(entry.getName()); 
    BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length); 

    while ((size = zis.read(buffer, 0, buffer.length)) != -1) { 
    bos.write(buffer, 0, size); 
    } 
    bos.flush(); 
    bos.close(); 
} 
zis.close(); 
fis.close(); 

}

0
public boolean unzip(String zipfilepath, String destinationdir) { 

      try { 
       FileInputStream fis = new FileInputStream(zipfilepath); 
       ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
       ZipEntry entry; 

       while ((entry = zis.getNextEntry()) != null) { 
        System.out.println("Unzipping: " + entry.getName()); 

        int size; 
        byte[] buffer = new byte[2048]; 

        FileOutputStream fos = new FileOutputStream(destinationdir+ "/" + entry.getName()); 
        BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length); 

        while ((size = zis.read(buffer, 0, buffer.length)) != -1) { 
        bos.write(buffer, 0, size); 
        } 
        bos.flush(); 
        bos.close(); 
       } 
       zis.close(); 
       fis.close(); 
       return true; 
       }catch(Exception e){ 
        return false; 
       } 
     } 



String zipfilepath = context.getFilesDir().getPath()+"/"+myfile.zip; 
String destinationdir = context.getFilesDir().getPath(); 


unzip(zipfilepath, destinationdir); 
Verwandte Themen