mardi 13 novembre 2012

Décompresser un fichier Zip

Je souhaitais, via un programme ou code java décompresser un fichier Zip.
J'ai donc dans un premier temps cherché du côté de l'api standard Java (http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary.html).
Le problème, c'est qu'il n'y a rien d'automatique.

Heureusement pour moi, MkYong (http://www.mkyong.com) s'est déjà penché sur la question.
Si vous ne connaissez pas ce site, je vous le conseil, régulièrement ses publications sont forts utiles.

J'ai apporté le support des répertoires dans le zip pour les créer autmatiquement et corrigé une erreur.
/**
 * 
 */
package org.util.zip ;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author MkYong & MARTINEAU Emeric
 * http://www.mkyong.com/java/how-to-decompress-files-from-a-zip-file/
 * 
 */
public class UnZip {
 /**
  * Unzip it
  * 
  * @param zipFile
  *            input zip file
  * @param output
  *            zip file output folder
  */
 public void unZipIt(String zipFile, String outputFolder) {
  try {

   // create output directory is not exists
   File folder = new File(outputFolder) ;
   
   if (!folder.exists()) {
    folder.mkdir() ;
   }

   // get the zip file content
   ZipInputStream zis = new ZipInputStream(
     new FileInputStream(zipFile)) ;
   // get the zipped file list entry
   ZipEntry ze = zis.getNextEntry() ;

   String fileName ;
   
   while (ze != null) {
    fileName = ze.getName() ;
    
    if (ze.isDirectory()) {
     System.out.println("Creating directory : ".concat(fileName)) ;
     
     new File(outputFolder + File.separator + fileName).mkdirs() ;
    } else {
     extractFile(outputFolder, zis, fileName) ;
    }

    zis.closeEntry();
    ze = zis.getNextEntry() ; 
   }

   zis.close();

   System.out.println("Done");

  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }
 
 private void extractFile(final String outputFolder, final ZipInputStream zis, 
   final String fileName) throws IOException {
  final byte[] buffer = new byte[1024] ;
  
  final File newFile = new File(outputFolder + File.separator
    + fileName);

  System.out.println("file unzip : " + newFile.getAbsoluteFile());

  // create all non exists folders
  // else you will hit FileNotFoundException for compressed folder
  new File(newFile.getParent()).mkdirs();

  final FileOutputStream fos = new FileOutputStream(newFile);

  int len;
  
  while ((len = zis.read(buffer)) > 0) {
   fos.write(buffer, 0, len);
  }

  fos.close();
   
 }
}
Un problème étrange toutefois se produit. Si vous créer un fichier zip avec 7Zip il arrive qu'il y ai un problème de CRC

Un autre exemple de qualité : http://www.java-forums.org/blogs/java-io/973-how-work-zip-files-java.html

Aucun commentaire:

Enregistrer un commentaire