2010-10-20 12 views
14

Uygulamam yaklaşık 350 dosya içeren bir zip dosyası indiriyor. JPG ve HTML dosyalarının bir karışımı. Bunu yapmak için yazdığım işlev gayet iyi çalışıyor ama unzipping her zamankinden daha iyi. İlk başta, sd kartına yazmanın yavaş olabileceğini düşündüm. ama aynı zip'i telefonumdaki başka bir uygulamayla açtığımda çok daha hızlı çalışıyor. optimize etmek için yapabileceğim bir şey var mı? CommonsWare içinSD Karttan Zip Çıkarma çok yavaş. Performansı nasıl optimize edebilirim?

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

sayesinde ben böyle kodumu modifiye:

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

büyük performans farkı burada

kodudur. Çok teşekkürler.

cevap

14

Her defasında bir bayt okuyor ve yazıyorsunuz. Bir seferde daha büyük bir bloğu okuma ve yazma düşünün.

+1

TEŞEKKÜRLER yardımcı olacaktır! Bu aslında hile yaptı. – notme

+1

Bu cevapta sağlanan bağlantı çalışmıyor. –

+0

@CommonsWare Bağlantı kesildi, lütfen bunu düzeltebilir misiniz? – Scorchio

0

Sadece bu yöntemi bir kez kullanın ve bana süper hızlı bir süreç olduğuna inanıyorum .. 1 saniye içinde herhangi bir dosyayı atlamadan tüm dosyaları unzip edecektir.

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

Umut bu .. Mutlu Kodlama :)

İlgili konular