2010-10-20 50 views
14

mon application télécharge un fichier zip avec environ 350 fichiers. Un mélange de fichiers JPG et HTML. La fonction que j'ai écrite pour le faire fonctionne très bien, mais la décompression prend pour toujours. Au début, je pensais que la raison pourrait être que l'écriture sur la carte SD est lente. mais quand je décompresse le même zip avec une autre application sur mon téléphone, cela fonctionne beaucoup plus vite. Y a-t-il quelque chose que je puisse faire pour l'optimiser?Extraire Zip sur carte SD est très lent. Comment puis-je optimiser les performances?

est ici le code:

private void extract() { 

    try { 
     FileInputStream inStream = new FileInputStream(targetFilePath); 
     ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(inStream)); 
     ZipEntry entry; 
     ZipFile zip = new ZipFile(targetFilePath); 

        //i know the contents for the zip so i create the dirs i need in advance 
     new File(targetFolder).mkdirs(); 
     new File(targetFolder + "META-INF").mkdir(); 
     new File(targetFolder + "content").mkdir(); 

     int extracted = 0; 

     while((entry = zipStream.getNextEntry()) != null) { 
      if (entry.isDirectory()) { 
       new File(targetFolder + entry.getName()).mkdirs(); 
      } else { 
       FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName()); 
       for (int c = zipStream.read(); c != -1; c = zipStream.read()) { 
        outStream.write(c); 
       } 
       zipStream.closeEntry(); 
       outStream.close(); 

       extracted ++; 
      } 

      publishProgress(""+(int)extracted*100/zip.size()); 
     } 

     zipStream.close(); 
     inStream.close(); 
     // 
     new File(targetFilePath).delete(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

grâce à CommonsWare i modifié mon code comme ceci:

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

       FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName()); 
       BufferedOutputStream bufferOut = new BufferedOutputStream(outStream, buffer.length); 

       while((size = zipStream.read(buffer, 0, buffer.length)) != -1) { 
        bufferOut.write(buffer, 0, size); 
       } 

       bufferOut.flush(); 
       bufferOut.close(); 

grande différence de performance. Merci beaucoup.

Répondre

14

Vous lisez et écrivez un octet à la fois. Pensez à lire et écrire un bloc plus grand à la fois.

+1

MERCI! Cela a effectivement fait le tour. – notme

+1

Le lien fourni dans cette réponse ne fonctionne pas. –

+0

@CommonsWare Le lien est en panne, pourriez-vous résoudre ce problème? – Scorchio

0

Il suffit d'utiliser cette méthode une fois et croyez-moi c'est un processus super rapide .. Il décompressera tous les fichiers sans sauter aucun fichier avec en 1 seconde.

public boolean rajDhaniSuperFastUnzip(String inputZipFile, String destinationDirectory) 
     { 
    try { 
     int BUFFER = 2048; 
     List<String> zipFiles = new ArrayList<String>(); 
     File sourceZipFile = new File(inputZipFile); 
     File unzipDestinationDirectory = new File(destinationDirectory); 
     unzipDestinationDirectory.mkdir(); 
     ZipFile zipFile; 
     zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ); 
     Enumeration<?> zipFileEntries = zipFile.entries(); 
     while (zipFileEntries.hasMoreElements()) { 
      ZipEntry entry = (ZipEntry) zipFileEntries.nextElement(); 
      String currentEntry = entry.getName(); 
      File destFile = new File(unzipDestinationDirectory, currentEntry); 
      if (currentEntry.endsWith(".zip")) { 
       zipFiles.add(destFile.getAbsolutePath()); 
      } 

      File destinationParent = destFile.getParentFile(); 

      destinationParent.mkdirs(); 

      try { 
       if (!entry.isDirectory()) { 
        BufferedInputStream is = 
          new BufferedInputStream(zipFile.getInputStream(entry)); 
        int currentByte; 
        byte data[] = new byte[BUFFER]; 

        FileOutputStream fos = new FileOutputStream(destFile); 
        BufferedOutputStream dest = 
          new BufferedOutputStream(fos, BUFFER); 
        while ((currentByte = is.read(data, 0, BUFFER)) != -1) { 
         dest.write(data, 0, currentByte); 
        } 
        dest.flush(); 
        dest.close(); 
        is.close(); 
       } 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
     zipFile.close(); 

     for (Iterator<String> iter = zipFiles.iterator(); iter.hasNext();) { 
      String zipName = (String)iter.next(); 
      doUnzip(
       zipName, 
       destinationDirectory + 
        File.separatorChar + 
        zipName.substring(0,zipName.lastIndexOf(".zip")) 
      ); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false ; 
    } 
    return true; 
} 

Espérons que cela vous aidera .. Bonne programmation :)