Comment travailler avec des archives compressées au format ZIP en Java ?

vendredi 13 avril 2001

Comment travailler avec des archives compressées au format ZIP en Java ?

Ce HowTo a pour but de vous expliquer comment créer des archives de fichiers compressées au format ZIP et comment ensuite les ouvrir et extraire les fichiers contenus à l’intérieur. Ce n’est en aucun cas un cours théorique sur la compression de données en Java, il s’agit juste d’un tutoriel. De plus, vous devrez utiliser la documentation de Sun si vous désirez en savoir plus sur, par exemple, la manière d’afficher le nom de tous les fichiers d’une archive. Le cas échéant, écrivez moi à [email protected].

Nous allons dans un premier temps définir une archive ZIP:

</tr> </table>

Ce tutoriel comprendra 2 parties: pour commencer comment créer une archive ZIP, ensuite, comment en lire une et extraire ses fichiers.

Comment créer une archive ZIP en Java ?

// Créer des flux d'entrée de données, en indiquant comme paramètre le fichier à compresser.
FileInputStream fin1 = new FileInputStream("monPremierFichier.txt");
FileInputStream fin2 = new FileInputStream("monSecondFichier.xls");
FileInputStream fin3 = new FileInputStream("monTroisiemeFichier.doc");

// Créer un flux de sortie pour le fichier ZIP final.
FileOutputStream fout = new FileOutputStream("monFichier.zip");

// Mettre le flux en mémoire tampon (buffered), et le définir comme flux de compression ZIP
BufferedOutputStream bout = new BufferedOutputStream(fout);
ZipOutputStream zout = new ZipOutputStream(bout);

// Définir le taux de compression de l'archive, de 0 à 9 (Optionnel)
zout.setLevel(6);

// Associer un commentaire à l'archive (Optionnel)
zout.setComment("Ceci est un commentaire");

// Les fichiers ZIP sont des archives, elles stockent donc plusieurs fichiers, chaque fichier est contenu dans une "entrée", nous devons donc créer une nouvelle
// entrée pour chaque nouveau fichier de l'archive: (on pourra aussi utiliser ze1.getName() pour récupérer le nom de l'entrée, ceci est très utilse si vous voulez
// programmer un outil du type WinZip qui affiche la liste des fichiers d'une archive.)
ZipEntry ze1 = new ZipEntry("monPremierFichier.txt");
ZipEntry ze2 = new ZipEntry("monSecondFichier.xls");
ZipEntry ze3 = new ZipEntry("monTroisiemeFichier.doc");
zout.putNextEntry(ze1);
zout.putNextEntry(ze2);
zout.putNextEntry(ze3);

// Nous devons ensuite copier le flux d'entrée de fichier dans le flux de sortie compressé. Le code ci-dessous n'est pas commenté, ce n'est pas l'objet de ce tutoriel:
try
{
synchronized (fin)
{
synchronized (zout)
{
byte[] buffer = new byte[256];
while (true)
{
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
} }catch(Exception err) {;}

// Une fois les flux copiés nous devons fermer l'entrée
zout.closeEntry();

// Puis fermer les flux...
fin.close();
zout.close();

Comment décompresser les fichiers contenus dans une archive ZIP ?

// Créer un flux d'entrée contenant l'archive ZIP à décompresser
FileInputStream fin = new FileInputStream("monFichier.zip");

// Mettre ce flux en mémoire tampon
BufferedInputStream bis = new BufferedInputStream(fin);

// Identifier le flux tampon comme flux de compression ZIP
ZipInputStream zin = new ZipInputStream(bis);

// Définir un objet ZipEntry
ZipEntry ze = null;

// Tant que cet objet est différent de nul (tant qu'il y a des fichiers dans l'archive)...
while ((ze = zin.getNextEntry()) != null) {

// ... exécuter le code suivant:
// Créer un flux de sortie pour le fichier de l'entrée courante
FileOutputStream fout = new FileOutputStream(ze.getName());
// Copier les flux:
try
{
synchronized (zin)
{
synchronized (fout)
{
byte[] buffer = new byte[256];
while (true)
{
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
} }catch(Exception err) {;}

// Fermer l'entrée et le flux de sortie
zin.closeEntry();
fout.close();

// Terminer l'instruction while:
}

// Fermer le flux d'entrée
zin.close();

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 23 avril 2001

Extension par défaut du fichier .ZIP
Programmes pour les lire sous Windows Winzip, Pkzip, </p>

Norton Unzip...</td> </tr>

Rassemble dans un fichier plusieurs autres fichiers Oui
Rassemble des fichiers en les compressant (réduisant </p>

leur taille)</td>

Oui
On peut choisir le taux de compression Oui de 0 à 9
Contient un fichier META (description de l'archive) Non
On peut lire une archive ZIP sous plusieurs OS Oui: Windows 3.1/95/98/Me/Nt/2000, Linux (toutes distributions), </p>

Sparc Solaris, MacOs, BeOs, Os2/Warp, etc...</td> </tr>

On peut joindre des commentaires à l'archive Oui

Comment travailler avec des archives compressées au format ZIP en Java ?

Ce HowTo a pour but de vous expliquer comment créer des archives de fichiers compressées au format ZIP et comment ensuite les ouvrir et extraire les fichiers contenus à l’intérieur. Ce n’est en aucun cas un cours théorique sur la compression de données en Java, il s’agit juste d’un tutoriel. De plus, vous devrez utiliser la documentation de Sun si vous désirez en savoir plus sur, par exemple, la manière d’afficher le nom de tous les fichiers d’une archive. Le cas échéant, écrivez moi à [email protected].

Nous allons dans un premier temps définir une archive ZIP:

</tr> </table>

Ce tutoriel comprendra 2 parties: pour commencer comment créer une archive ZIP, ensuite, comment en lire une et extraire ses fichiers.

Comment créer une archive ZIP en Java ?

// Créer des flux d'entrée de données, en indiquant comme paramètre le fichier à compresser.
FileInputStream fin1 = new FileInputStream("monPremierFichier.txt");
FileInputStream fin2 = new FileInputStream("monSecondFichier.xls");
FileInputStream fin3 = new FileInputStream("monTroisiemeFichier.doc");

// Créer un flux de sortie pour le fichier ZIP final.
FileOutputStream fout = new FileOutputStream("monFichier.zip");

// Mettre le flux en mémoire tampon (buffered), et le définir comme flux de compression ZIP
BufferedOutputStream bout = new BufferedOutputStream(fout);
ZipOutputStream zout = new ZipOutputStream(bout);

// Définir le taux de compression de l'archive, de 0 à 9 (Optionnel)
zout.setLevel(6);

// Associer un commentaire à l'archive (Optionnel)
zout.setComment("Ceci est un commentaire");

// Les fichiers ZIP sont des archives, elles stockent donc plusieurs fichiers, chaque fichier est contenu dans une "entrée", nous devons donc créer une nouvelle
// entrée pour chaque nouveau fichier de l'archive: (on pourra aussi utiliser ze1.getName() pour récupérer le nom de l'entrée, ceci est très utilse si vous voulez
// programmer un outil du type WinZip qui affiche la liste des fichiers d'une archive.)
ZipEntry ze1 = new ZipEntry("monPremierFichier.txt");
ZipEntry ze2 = new ZipEntry("monSecondFichier.xls");
ZipEntry ze3 = new ZipEntry("monTroisiemeFichier.doc");
zout.putNextEntry(ze1);
zout.putNextEntry(ze2);
zout.putNextEntry(ze3);

// Nous devons ensuite copier le flux d'entrée de fichier dans le flux de sortie compressé. Le code ci-dessous n'est pas commenté, ce n'est pas l'objet de ce tutoriel:
try
{
synchronized (fin)
{
synchronized (zout)
{
byte[] buffer = new byte[256];
while (true)
{
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
} }catch(Exception err) {;}

// Une fois les flux copiés nous devons fermer l'entrée
zout.closeEntry();

// Puis fermer les flux...
fin.close();
zout.close();

Comment décompresser les fichiers contenus dans une archive ZIP ?

// Créer un flux d'entrée contenant l'archive ZIP à décompresser
FileInputStream fin = new FileInputStream("monFichier.zip");

// Mettre ce flux en mémoire tampon
BufferedInputStream bis = new BufferedInputStream(fin);

// Identifier le flux tampon comme flux de compression ZIP
ZipInputStream zin = new ZipInputStream(bis);

// Définir un objet ZipEntry
ZipEntry ze = null;

// Tant que cet objet est différent de nul (tant qu'il y a des fichiers dans l'archive)...
while ((ze = zin.getNextEntry()) != null) {

// ... exécuter le code suivant:
// Créer un flux de sortie pour le fichier de l'entrée courante
FileOutputStream fout = new FileOutputStream(ze.getName());
// Copier les flux:
try
{
synchronized (zin)
{
synchronized (fout)
{
byte[] buffer = new byte[256];
while (true)
{
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
} }catch(Exception err) {;}

// Fermer l'entrée et le flux de sortie
zin.closeEntry();
fout.close();

// Terminer l'instruction while:
}

// Fermer le flux d'entrée
zin.close();

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 23 avril 2001

Extension par défaut du fichier .ZIP
Programmes pour les lire sous Windows Winzip, Pkzip, </p>

Norton Unzip...</td> </tr>

Rassemble dans un fichier plusieurs autres fichiers Oui
Rassemble des fichiers en les compressant (réduisant </p>

leur taille)</td>

Oui
On peut choisir le taux de compression Oui de 0 à 9
Contient un fichier META (description de l'archive) Non
On peut lire une archive ZIP sous plusieurs OS Oui: Windows 3.1/95/98/Me/Nt/2000, Linux (toutes distributions), </p>

Sparc Solaris, MacOs, BeOs, Os2/Warp, etc...</td> </tr>

On peut joindre des commentaires à l'archive Oui