Android 3.x + Java ZipFile Class – Impossible de lire ZipEntries à partir de gros fichiers

Si j'ouvre un grand fichier zip (250 Mo) via la classe ZipFile et essaye de lire les entrées. Cela fonctionne bien sur 2.x dans l'émulateur et le matériel réel. Si j'utilise exactement un code sur ma tablette (Asus Transformer avec 4.0.3) ou l'émulateur (3.2), je ne peux pas lire d'entrées. La fonction size () de la classe ZipFile renvoie toujours zéro et ZipFile ne renvoie aucune entrée zip. Même l'application zip qui vient avec la ROM sur ma tablette ne peut pas lire d'entrées. Le fichier zip n'est pas endommagé. Je l'ai vérifié.

Le code à lire de ZipFile fonctionne bien sur toutes les versions avec des fichiers zip plus petits. Ce qui a changé entre 2.x et 3.x / 4.x ??

Mon fichier Testfile est le C64Music.zip de la collection HighVoltage Sid. Il contient plus de 40 000 fichiers et environ 250 Mo.

Je n'ai aucun indice où regarder.

  • Comment fichier zip avec mot de passe (AES) pour iOS et Android?
  • 3 Solutions collect form web for “Android 3.x + Java ZipFile Class – Impossible de lire ZipEntries à partir de gros fichiers”

    C'est un problème connu avec la mise en œuvre de ZipFile Android:

    http://code.google.com/p/android/issues/detail?id=23207

    Fondamentalement, les fichiers zip ne supportent que 65k entrées. Il existe une version étendue du format de fichier zip appelé Zip64, qui prend en charge un plus grand nombre d'entrées. Malheureusement, ZipFile sur Android ne peut pas lire Zip64. Vous trouverez probablement que le fichier C64Music.zip se trouve au format Zip64

    Un travail consiste à utiliser la bibliothèque Apache Commons Compress au lieu de la mise en œuvre native. Leur version de ZipFile prend en charge Zip64: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html

      public class Compress { private static final int BUFFER = 2048; private String[] _files; private String _zipFile; public Compress(String[] files, String zipFile) { _files = files; _zipFile = zipFile; } public void zip() { try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(_zipFile); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); byte data[] = new byte[BUFFER]; for(int i=0; i < _files.length; i++) { Log.v("Compress", "Adding: " + _files[i]); FileInputStream fi = new FileInputStream(_files[i]); origin = new BufferedInputStream(fi, BUFFER); ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1)); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); } out.close(); } catch(Exception e) { e.printStackTrace(); } } } Call Compress like given below where you want to zip a file :---- String zipFilePath = "fileName.zip"; File zipFile = new File(zipFilePath); String[] files = new String[] {"/sdcard/fileName"}; if(!zipFile.exists()){ new Compress(files, zipFilePath).zip(); } 

    Beaucoup de changements ont été effectués dans 3.x / 4.x pour éviter les abus sur le thread UI. Par conséquent, il est possible que votre application se bloque parce que vous ne déchargez pas l'opération coûteuse d'E / S du disque sur un Thread séparé.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.