2011-09-20 19 views
25

Come zip e decomprimere i file che sono tutti già in DDMS: data/data/mypackage/files/ Ho bisogno di un semplice esempio per quello. Ho già cercato relativo a zip e decomprimere. Ma, nessun esempio disponibile per me. Qualcuno può dire qualche esempio. Advance Grazie.Come comprimere e decomprimere i file?

+1

dare uno sguardo qui: http://www.jondev.net/articles/Zipping_Files_with_Android_(Programmatically), sulla prima pagina durante la ricerca di "Android come zip file" su Google. – nhaarman

risposta

55

Dai un'occhiata a java.util.zip. * Classi per funzionalità zip. Ho fatto un semplice codice zip/unzip, che ho incollato qui sotto. Spero che sia d'aiuto.

public static void zip(String[] files, String zipFile) throws IOException { 
    BufferedInputStream origin = null; 
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); 
    try { 
     byte data[] = new byte[BUFFER_SIZE]; 

     for (int i = 0; i < files.length; i++) { 
      FileInputStream fi = new FileInputStream(files[i]);  
      origin = new BufferedInputStream(fi, BUFFER_SIZE); 
      try { 
       ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1)); 
       out.putNextEntry(entry); 
       int count; 
       while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { 
        out.write(data, 0, count); 
       } 
      } 
      finally { 
       origin.close(); 
      } 
     } 
    } 
    finally { 
     out.close(); 
    } 
} 

public static void unzip(String zipFile, String location) throws IOException { 
    try { 
     File f = new File(location); 
     if(!f.isDirectory()) { 
      f.mkdirs(); 
     } 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile)); 
     try { 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
       String path = location + ze.getName(); 

       if (ze.isDirectory()) { 
        File unzipFile = new File(path); 
        if(!unzipFile.isDirectory()) { 
         unzipFile.mkdirs(); 
        } 
       } 
       else { 
        FileOutputStream fout = new FileOutputStream(path, false); 
        try { 
         for (int c = zin.read(); c != -1; c = zin.read()) { 
          fout.write(c); 
         } 
         zin.closeEntry(); 
        } 
        finally { 
         fout.close(); 
        } 
       } 
      } 
     } 
     finally { 
      zin.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e(TAG, "Unzip exception", e); 
    } 
} 
+0

Non funziona per me. Attacca in loop infinito. – usman

+0

Questo è sbagliato: 'Stringa percorso = posizione + ze.getName(); if (ze.isDirectory()) { File unzipFile = new File (percorso); if (! UnzipFile.isDirectory()) { unzipFile.mkdirs(); } } ' – maohieng

+0

quale dovrebbe essere il valore della variabile dimensione del buffer? –

45

La brianestey funzione zip disponibile funziona bene, ma la funzione di decompressione è molto lenta a causa leggere un byte alla volta. Ecco una versione modificata della sua funzione unzip che utilizza un buffer ed è molto più veloce.

/** 
* Unzip a zip file. Will overwrite existing files. 
* 
* @param zipFile Full path of the zip file you'd like to unzip. 
* @param location Full path of the directory you'd like to unzip to (will be created if it doesn't exist). 
* @throws IOException 
*/ 
public static void unzip(String zipFile, String location) throws IOException { 
    int size; 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    try { 
     if (!location.endsWith(File.separator)) { 
      location += File.separator; 
     } 
     File f = new File(location); 
     if(!f.isDirectory()) { 
      f.mkdirs(); 
     } 
     ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE)); 
     try { 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
       String path = location + ze.getName(); 
       File unzipFile = new File(path); 

       if (ze.isDirectory()) { 
        if(!unzipFile.isDirectory()) { 
         unzipFile.mkdirs(); 
        } 
       } else { 
        // check for and create parent directories if they don't exist 
        File parentDir = unzipFile.getParentFile(); 
        if (null != parentDir) { 
         if (!parentDir.isDirectory()) { 
          parentDir.mkdirs(); 
         } 
        } 

        // unzip the file 
        FileOutputStream out = new FileOutputStream(unzipFile, false); 
        BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE); 
        try { 
         while ((size = zin.read(buffer, 0, BUFFER_SIZE)) != -1) { 
          fout.write(buffer, 0, size); 
         } 

         zin.closeEntry(); 
        } 
        finally { 
         fout.flush(); 
         fout.close(); 
        } 
       } 
      } 
     } 
     finally { 
      zin.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e(TAG, "Unzip exception", e); 
    } 
} 
+2

Questa decompressione non ha funzionato per me. Stavo ricevendo errori perché stavo cercando di decomprimere un file prima della sua directory genitore. Nell'istruzione else ho aggiunto una condizione per creare la directory padre se non esiste. Ora funziona. –

+0

@ J-L Grazie per avermelo fatto notare. Ho modificato il codice di conseguenza. – Ben

+0

veloce e funziona gr8, my BUFFER_SIZE = 8192 –

Problemi correlati