Java : Comment compresser un fichier (ZIP) ?

Je vous propose de découvrir ci-après une méthode pour « zipper » un fichier en Java. Même si cela n’est pas très complexe, il est toujours pratique d’avoir ce genre de méthodes à portée de main.
Dans un premier temps, nous allons voir comment zipper un seul fichier, puis comment améliorer la méthode pour zipper plusieurs fichiers.

Méthode

Voici d’abord les imports qui vous seront utiles.

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

Cette méthode prend en entrée le chemin vers le fichier à zipper et le chemin vers le fichier zip à créer. Toutes les exceptions sont à traiter lors de l’appel de cette méthode.
Si le zip s’effectue sans problème, un objet de classe « File » est retourné, il représente le fichier créé.

public static File zipFile(String source, String destination)
		throws FileNotFoundException, IOException {
	File destinationFile = new File(destination);
	// On ouvre les flux entrants/sortants
	FileOutputStream fos = new FileOutputStream(destinationFile);
	ZipOutputStream zos = new ZipOutputStream(fos);
	FileInputStream fis = new FileInputStream(source);
	// On ajoute un nouveau fichier au zip
	zos.putNextEntry(new ZipEntry(source));
	// On écrit le contenu du fichier ajoute
	byte[] buf = new byte[1024];
	int len = 0;
	while ((len = fis.read(buf)) > 0) {
		zos.write(buf, 0, len);
	}
	// On termine l'ajout du nouveau fichier
	zos.closeEntry();
	// On ferme les flux
	zos.close();
	fis.close();
	// On retourne le File du fichier zippé
	return destinationFile;
}

Utilisation

Voici une méthode « main » qui zip le fichier et traite le retour.

public static void main(String[] args) {
	try {
		System.out.println("Zipping one.txt to one.zip");
		File zippedFile = zipFile("one.txt", "one.zip");
		System.out.println("Zipped : " + zippedFile.getAbsolutePath());
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

Zipper plusieurs fichier

Pour ajouter plusieurs fichiers il suffit d’appeler plusieurs fois les méthodes « ZipOutputStream.putNextEntry(ZipEntry) » et « ZipOutputStream.close() ». Pour la méthode donnée dans cet article il suffirait de remplacer l’ajout du fichier par une boucle. Votre méthode devient donc :

public static File zipFile(String[] sources, String destination) throws FileNotFoundException, IOException {
	File destinationFile = new File(destination);
	// On ouvre les flux entrants/sortants
	FileOutputStream fos = new FileOutputStream(destinationFile);
	ZipOutputStream zos = new ZipOutputStream(fos);
	for (String source : sources) {
		FileInputStream fis = new FileInputStream(source);
		// On ajoute un nouveau fichier au zip
		zos.putNextEntry(new ZipEntry(source));
		// On ecrit le contenu du fichier ajoute
		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = fis.read(buf)) > 0) {
			zos.write(buf, 0, len);
		}
		// On termine l'ajout du nouveau fichier
		zos.closeEntry();
		fis.close();
	}
	zos.close();
	return destinationFile;
}

Elle peut être appelée de la façon suivante :

File zippedFile = zipFile( new String[]{ "one.txt", "two.txt" }, "both.zip");

Vous voilà à présent outillé pour compresser des fichiers avec Java !

1 réflexion sur “Java : Comment compresser un fichier (ZIP) ?”

  1. Bonjour,
    J’ai un petit problème avec ce code: quand je zip je donne le path absolu et je suppose que c’est comme si j’étais a la racine ce qui fait que ça crée une multitude de dossier jusqu’a mon fichier comme il est stocké sur le DD alors que si je me mettais au niveau du fichier je naurais pas ces sous dossier.
    Est ce qu’on peut faire quelque chose ?
    merci

Les commentaires sont fermés.