Publié le 19/05/2010
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Decompresser un fichier zip avec ZipInputStream

Les compressions zip sont utilisées sous de nombreux OS. Java offre un bon support avec ZipInputStream d'accès et de modification des fichier zip inclu dans le package java.util.zip.

Utiliser une archive zip en JAVA

Pour faciliter le travail avec des fichiers ZIP dans une application JAVA, nous avons regroupé les fonctions de compression et de décompression dans une class. L'ajout et la lecture de fichiers dans une archive zip utilisent l'objet ZipEntry qui contient toutes les données disponibles sur cette entrée précise (le nom de la ressource, les tailles compressées et non-compressées, la date, le CRC, les données supplémentaires, le commentaire éventuel et la méthode de compression).

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
 
 
/*
* Decompresser un fichier zip avec ZipInputStream
* http://www.fobec.com/java/909/decompresser-fichier-zip-avec-zipinputstream.html
*/
 
 
public class ZipFileReader {
    /**
     * Lister les fichiers contenus dans le zip
     * @param archive nom du fichier zip
     * @return liste sous forme ['nom, 'taille', 'date']
     */
    public static ArrayList getFiles(String archive) {
        ArrayList fileList = new ArrayList<String>();
        ZipInputStream zipInputStream = null;
        ZipEntry zipEntry = null;
        Long size;
 
        try {
            zipInputStream = new ZipInputStream(new FileInputStream(archive));
            zipEntry = zipInputStream.getNextEntry();
            while (zipEntry != null) {
                String[] file = new String[3];
                file[0] = zipEntry.getName();
                size = zipEntry.getSize()/1024;
                file[1] = size.toString()+ " ko";
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
                file[2] = simpleDateFormat.format(new Date(zipEntry.getTime()));
 
                fileList.add(file);
                zipEntry = zipInputStream.getNextEntry();
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ZipFileReader.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                zipInputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(ZipFileReader.class.getName()).log(Level.SEVERE, null, ex);
            }
            return fileList;
        }
    }
 
    /**
     * Extraire un fichier
     * @param archive fichier zip
     * @param file nom du fichier à extraire
     * @param destPath répertoir de destination du fichier
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void extractTo(String archive, String file, String destPath) throws FileNotFoundException, IOException {
        ZipInputStream zipInputStream = null;
        ZipEntry zipEntry = null;
        byte[] buffer = new byte[2048];
 
        zipInputStream = new ZipInputStream(new FileInputStream(archive));
        zipEntry = zipInputStream.getNextEntry();
        while (zipEntry != null) {
            if (zipEntry.getName().equalsIgnoreCase(file)) {
                FileOutputStream fileoutputstream = new FileOutputStream(destPath + file);
                int n;
 
                while ((n = zipInputStream.read(buffer, 0, 2048)) > -1) {
                    fileoutputstream.write(buffer, 0, n);
                }
 
                fileoutputstream.close();
                zipInputStream.closeEntry();
 
            }
            zipEntry = zipInputStream.getNextEntry();
        }
    }
} 

Lister le contenu d'une archive zip

Utilisons la class ZipFileReader pour lire le contenu du ficher fichier.zip, le résultat est renvoyé dans un ArrayList dont les items sont de type String [].

ArrayList<String[]> list = ZipFileReader.getFiles("c://fichier.zip");
String[] file = null;
 
for (int i = 0; i < list.size(); i++) {
file = list.get(i);
System.out.print("nom: "+file[0] +" - taille: "+file[1]+ " - date: "+file[2]+ "n");
}

Extraire un fichier d'un zip

Ceci est un exemple pour extraire le fichier exemple.doc vers le répertoire c:/ du disque dur.

try {
ZipFileReader.extractTo("c://fichier.zip", "exemple.doc", "c://");
} catch (FileNotFoundException ex) {
Logger.getLogger(ZipFileReader.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ZipFileReader.class.getName()).log(Level.SEVERE, null, ex);
}

Savez-vous que le format JAR utilisé nativement par les applications JAVA est une archive compressée ZIP ? Ainsi la compression et le décompression de fichier dans une application JAVA pose peu de souci et marche bien.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - class
Mise a jour
19/05/2010
Visualisation
vu 4477 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 265 articles
|BIO_PSEUDO|
Commentaires récents

Publié par etoiliste010 dans java

BONSOIR le code compile mais
Grave: null
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. gd4sm1845967wib.6

at com.sun.mail.smtp.SMTPTransport.i...

Publié par Yannick dans tuto

Sur un de mes sites j'ai vraiment du mal a gerer le gzip sur 1and1, Je vais tout de suite tester tout ca et je vous tiens informe :)

Publié par khaoula dans java

s' il vous plait j'ai un projet de fin d'etude et je veux integrer une carte google maps dans une interface avec java et toujours j'aurais des problemes et merci de votre reponse

Publié par Deepan dans php5

Bonjour,
Merci pour ce tuto qui m'a bien aide.
Je donne ici les modifications apportees pour que cela fonctionne chez moi.

/****************************************
* Ouvrir u...

Publié par bakouz dans java

Bonjour Axel,
je suis tombe sur ton site un peu par hasard.
Hasard car je ne le connaissais pas jusqu'a maintenant, et non du hasard car c'est exactement ce genre de class que je recherchais. !...