Zip, pour ziper et déziper un fichier aisément en java

Contenu du snippet

Permet de ziper et déziper des fichers. Le code est en Java.
Son intéret : faciliter le zipage et le dézipage en Java.

Source / Exemple :


//Titre :        Zip
//Version :      1.0
//Copyright :    Copyright (c) 2002
//Auteur :       JHelp
//Société :      GG
//Description :  Ziper et déziper
package zip;

import java.util.zip.*;
import java.util.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**

  • Classe gérant les fichiers ZIP
  • /
public class ZIP { //Nom du fichier private String fichier; //Liste des fichiers contenus dans le zip private Vector liste=new Vector(); //Séparateur de fichier, selon le sytéme d'exploitaion utilisé. Ainsi le code est valide partou private static final char separ=File.separatorChar; /**
  • Le rang où se trouve le nom
  • /
public static final int placeNom=0; /**
  • Le rang où se trouve la taille
  • /
public static final int placeTaille=1; /**
  • Le rang où se trouve la taille de compression
  • /
public static final int placeCompression=2; /**
  • Le rang où se trouve la date
  • /
public static final int placeDate=3; /**
  • Le rang où se trouve le commentaire
  • /
public static final int placeCommentaire=4; /**
  • Crée le zip
  • @param fichier Le nom du fichier zip, avec son chemin complet
  • /
public ZIP(String fichier) throws Exception { this.fichier=fichier; File f=new File(fichier); //Si le fichier existe, on récupére le nom et les attributs des fichiers compréssés dans le zip if(f.exists()) { //C'est un fichier zip ZipFile fic=new ZipFile(fichier); //Récupération des fichiers Enumeration enum=fic.entries(); while(enum.hasMoreElements()) liste.addElement(enum.nextElement()); } } /**
  • Change le nom du fichier zip, avec un chemin complet
  • /
public void setNom(String nom) { fichier=nom; } /**
  • Donne un vecteur titre. Peut servir pour l'ent^te d'un JTable
  • /
public static Vector getTitre() { Vector titre=new Vector(); titre.addElement("Nom"); titre.addElement("Taille"); titre.addElement("Compression"); titre.addElement("Date"); titre.addElement("Commentaire"); return titre; } /**
  • Vecteur de vecteur contenant les donnéees <BR>
  • Pour récupérer la ligne l, colonnne c, faire : <BR>
  • Vector donnes=zip.contenu(); <BR>
  • ... <BR>
  • Vector lig=(Vector)donnees.get(l); <BR>
  • String valeur=(String)lig.get(c);
  • /
public Vector contenu() { int nb=liste.size(); Vector donnees=new Vector(); for(int i=0;i<nb;i++) { Vector ligne=new Vector(); ZipEntry entre=(ZipEntry)liste.elementAt(i); ligne.addElement(entre.getName()); ligne.addElement(""+entre.getSize()); long j=entre.getCompressedSize(); if(j>=0) ligne.addElement(""+j); else ligne.addElement(""); Date date=new Date(entre.getTime()); Calendar calendrier=Calendar.getInstance(); calendrier.setTime(date); ligne.addElement( calendrier.get(Calendar.HOUR_OF_DAY)+"h"+ calendrier.get(Calendar.MINUTE)+"m"+ calendrier.get(Calendar.SECOND)+"s le "+ calendrier.get(Calendar.DAY_OF_MONTH)+"/"+ calendrier.get(Calendar.MONTH)+"/"+ calendrier.get(Calendar.YEAR)); ligne.addElement(entre.getComment()); donnees.addElement(ligne); } return donnees; } /**
  • Donne une chaine représentant la caractéristique du fichier <BR>
  • @param place Rang de la caratéristique. <BR>
  • @param numero Numéro du fichier contenu dans le zip <BR>
  • Exemple : <BR>
  • Pour avoir la taille de compression du fichier numéro 5 faire : <BR>
  • String taille=zip.get(ZIP.placeCompression,5);
  • /
public String get(int place,int numero) { //Récupération des caractéristiques du fichier ZipEntry entre=(ZipEntry)liste.elementAt(numero); //Selon la caractéristique demandée, retourner la valeur corespondante switch(place) { //Le commentaire case placeCommentaire : return entre.getComment(); //La taille de compression case placeCompression : long j=entre.getCompressedSize(); if(j>=0) return ""+j; return ""; //La date du fichier case placeDate : //Transformation de la date exprimée en milliseconde, en date plus courante Date date=new Date(entre.getTime()); //Mise en place d'un calendrier à partir de la date Calendar calendrier=Calendar.getInstance(); calendrier.setTime(date); //Renvoie des données return calendrier.get(Calendar.HOUR_OF_DAY)+"h"+ calendrier.get(Calendar.MINUTE)+"m"+ calendrier.get(Calendar.SECOND)+"s le "+ calendrier.get(Calendar.DAY_OF_MONTH)+"/"+ calendrier.get(Calendar.MONTH)+"/"+ calendrier.get(Calendar.YEAR); //Le nom du fichier case placeNom : return entre.getName(); //La taille réelle du fichier case placeTaille : return ""+entre.getSize(); } //Renvoie la chaîne vide si la caractéristique n'existe pas return ""; } /**
  • Ajoute un fichier au fichier zip
  • /
public void ajouteFichier(File fichier) { ajouteFichier(fichier,null); } /**
  • Ajoute un fichier au fichier zip avec un commentaire
  • /
public void ajouteFichier(File fichier,String commentaire) { //Transforme le fichier en entrée du zip ZipEntry entre=new ZipEntry(fichier.getAbsolutePath().substring(3).replace(separ,'/')); entre.setSize(fichier.length()); entre.setTime(fichier.lastModified()); if(commentaire!=null) entre.setComment(commentaire); //Ajoute l'éntrée liste.addElement(entre); } /**
  • Retire le fichier du zip
  • /
public void retire(File fichier) { //Cacul le nom de l'entrée, en majuscule, corespondante au fichier String s=fichier.getAbsolutePath().substring(3).replace(separ,'/').toUpperCase(); //Chercher le rang de l'éntrée corespondante int rang=-1; int nb=liste.size(); for(int i=0;(i<nb)&&(rang<0);i++) { ZipEntry entre=(ZipEntry)liste.elementAt(i); if(entre.getName().toUpperCase().equals(s)) rang=i; } //Si l'éntrée existe, la retirée if(rang>=0) liste.removeElementAt(rang); } /**
  • @return Le nom du fichier
  • /
public int getNombreFichier() { return liste.size(); } /**
  • Retire l'élélement numéro numero
  • /
public void retire(int numero) { liste.removeElementAt(numero); } /**
  • Zip les fichiers dans le nom du zip correspondant. Met à jour les changements.
  • /
public void ziper() throws Exception { //Si le fichier n'existe pas, le créer File f=new File(fichier); if(!f.exists()) f.createNewFile(); //Ouverture du fichier zip en écriture ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fichier)); //Pour chaque entrée du zip int nb=liste.size(); for(int i=0;i<nb;i++) { //Récupérer l'éntrée courante ZipEntry entre=(ZipEntry)liste.elementAt(i); //Récupérer le nom de l'entrée String nom=entre.getName(); //Ajouter l'entrée au fichier physique zip zos.putNextEntry(entre); //Ouvrir l'entrée en lecture FileInputStream fis=new FileInputStream("C:\\"+nom.replace('/',separ)); //Ziper l'entrée dans le fichier zip byte[] tab=new byte[4096]; int lu=-1; do { lu=fis.read(tab); if(lu>0) zos.write(tab,0,lu); }while(lu>0); //Fermer l'entrée fis.close(); } //Force à finir le zipage, si jamais il reste des bits non traités zos.flush(); //Ferme le fichier zip zos.close(); } /**
  • Dézipe le fichier dans le dossier en paramétre. Respect du nom des dossiers et sous-dossiers
  • /
public void deziper(File dossier) throws Exception { //Ouverture du fichier zip en lecture ZipInputStream zis=new ZipInputStream(new FileInputStream(fichier)); //Récupére les entrées éffectivement zipées dans le zip ZipEntry ze=zis.getNextEntry(); //Tant qu'il y a des entrées while(ze!=null) { //Crée le dossier contenant le fichier une fois déziper, si il n'existe pas File f=new File(dossier.getAbsolutePath()+separ+ze.toString().replace('/',separ)); f.getParentFile().mkdirs(); //Ouvre l'entrée le fichier à déziper en écriture, le crée s'il n'existe pas FileOutputStream fos=new FileOutputStream(f); //Dézipe le fichier int lu=-1; byte[] tampon=new byte[4096]; do { lu=zis.read(tampon); if(lu>0) fos.write(tampon,0,lu); } while(lu>0); //Finir proprement fos.flush(); //Fermer le fichier à déziper fos.close(); //Passer au suivant ze=zis.getNextEntry(); } //Fermer le fichier zip zis.close(); } /**
  • Modifie le commentaire du fichier numéro numero
  • /
public void setCommentaire(int numero,String commentaire) { ZipEntry entre=(ZipEntry)liste.elementAt(numero); entre.setComment(commentaire); } }

Conclusion :


Si vous avez des questions concernant ce code, des commentaires, des critiques, des méthodes qui vous manquent, n'esitez pas à me contacter.
A bientôt.
JHelp

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.