Zipper / dézipper un fichier, un dossier

Soyez le premier à donner votre avis sur cette source.

Vue 24 740 fois - Téléchargée 1 050 fois

Description

Compresse / décompresse un fichier ou un dossier au format zip.

Source / Exemple :


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class Zip {

	private static final String ZIP_EXTENSION = ".zip";

	private static final int DEFAULT_LEVEL_COMPRESSION =
		Deflater.BEST_COMPRESSION;

	// Remplace l'extension si le fichier cible ne fini pas par '.zip'
	private static File getZipTypeFile(final File source, final File target)
	throws IOException {
		if (target.getName().toLowerCase().endsWith(ZIP_EXTENSION))
			return target;
		final String tName = target.isDirectory()
			? source.getName()
			: target.getName();
		final int index = tName.lastIndexOf('.');
		return new File(
			new StringBuilder(target.isDirectory()
					? target.getCanonicalPath()
					: target.getParentFile().getCanonicalPath())
				.append(File.separatorChar)
				.append(index < 0 ? tName : tName.substring(0 ,index))
				.append(ZIP_EXTENSION)
			.toString()
		);
	}
	
	// Compresse un fichier
	private final static void compressFile(final ZipOutputStream out,
    	final String parentFolder, final File file)
    throws IOException {
        final String zipName = new StringBuilder(parentFolder)
        	.append(file.getName())
        	.append(file.isDirectory() ? '/' : "")
        	.toString();
        
        // Définition des attributs du fichier
        final ZipEntry entry = new ZipEntry(zipName);
        entry.setSize(file.length());
    	entry.setTime(file.lastModified());
        out.putNextEntry(entry);
        
        // Traitement récursif s'il s'agit d'un répertoire
        if (file.isDirectory()) {
        	for (final File f : file.listFiles())
        		compressFile(out, zipName.toString(), f);
        	return;
        }
        
        // Ecriture du fichier dans le zip
    	final InputStream in = new BufferedInputStream(
    			new FileInputStream(file));
        try {
            final byte[] buf = new byte[8192];
            int bytesRead;
            while (-1 != (bytesRead = in.read(buf)))
                out.write(buf, 0, bytesRead);
        } finally {
            in.close();
        }
    }
	
	// Compresse un fichier à l'adresse pointée par le fichier cible.
	// Remplace le fichier cible s'il existe déjà.
	public static void compress(final File file, final File target,
		final int compressionLevel)
	throws IOException {
		final File source = file.getCanonicalFile();
		
		// Création du fichier zip
        final ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
        		getZipTypeFile(source, target.getCanonicalFile())));
        out.setMethod(ZipOutputStream.DEFLATED);
        out.setLevel(compressionLevel);
        
        // Ajout du(es) fichier(s) au zip
        compressFile(out, "", source);   
        out.close();
	}
	
	public static void compress(final File file, final int compressionLevel)
	        throws IOException {
		compress(file, file, compressionLevel);
	}
	public static void compress(final File file, final File target)
	        throws IOException {
		compress(file, target, DEFAULT_LEVEL_COMPRESSION);
	}
	public static void compress(final File file) throws IOException {
		compress(file, file, DEFAULT_LEVEL_COMPRESSION);
	}
	public static void compress(final String fileName, final String targetName,
	        final int compressionLevel) throws IOException {
		compress(new File(fileName), new File(targetName), compressionLevel);
	}
	public static void compress(final String fileName,
	        final int compressionLevel) throws IOException {
		compress(new File(fileName), new File(fileName), compressionLevel);
	}
	public static void compress(final String fileName, final String targetName)
	        throws IOException {
		compress(new File(fileName), new File(targetName),
		        DEFAULT_LEVEL_COMPRESSION);
	}
	public static void compress(final String fileName) throws IOException {
		compress(new File(fileName), new File(fileName),
		        DEFAULT_LEVEL_COMPRESSION);
	}
	
	// Décompresse un fichier zip à l'adresse indiquée par le dossier
	public static void decompress(final File file, final File folder,
		final boolean deleteZipAfter)
    throws IOException {
        final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(
        		new FileInputStream(file.getCanonicalFile())));
        ZipEntry ze;
        try {    
	        // Parcourt tous les fichiers
	        while (null != (ze = zis.getNextEntry())) {
	            final File f = new File(folder.getCanonicalPath(), ze.getName());
	            if (f.exists())
	            	f.delete();
	            
	            // Création des dossiers
	            if (ze.isDirectory()) {
	                f.mkdirs();
	                continue;
	            }
	            f.getParentFile().mkdirs();
	            final OutputStream fos = new BufferedOutputStream(
	            		new FileOutputStream(f));
	            
	            // Ecriture des fichiers
	            try {
	                try {
	                    final byte[] buf = new byte[8192];
	                    int bytesRead;
	                    while (-1 != (bytesRead = zis.read(buf)))
	                        fos.write(buf, 0, bytesRead);
	                } finally {
	                    fos.close();
	                }
	            } catch (final IOException ioe) {
	                f.delete();
	                throw ioe;
	            }
	        }
        } finally {
        	zis.close();
        }
        if (deleteZipAfter)
        	file.delete();
    }
	
	public static void decompress(final String fileName, final String folderName,
		final boolean deleteZipAfter)
    throws IOException {
		decompress(new File(fileName), new File(folderName), deleteZipAfter);
	}
	public static void decompress(final String fileName, final String folderName)
    throws IOException {
		decompress(new File(fileName), new File(folderName), false);
	}
	public static void decompress(final File file, final boolean deleteZipAfter)
    throws IOException {
		decompress(file, file.getCanonicalFile().getParentFile(), deleteZipAfter);
	}
	public static void decompress(final String fileName,
		final boolean deleteZipAfter)
    throws IOException {
		decompress(new File(fileName), deleteZipAfter);
	}
	public static void decompress(final File file)
    throws IOException {
		decompress(file, file.getCanonicalFile().getParentFile(), false);
	}
	public static void decompress(final String fileName)
    throws IOException {
		decompress(new File(fileName));
	}

	
	public static void main(String[] args)
	throws IOException {
		Zip.compress("C:\\test.txt", "C:\\", Deflater.BEST_SPEED);
		Zip.decompress("C:\\test.zip", ".", false);
    }
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

kmeleon1
Messages postés
6
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
13 mars 2009
-
Bonjour,

Félicitations pour ta source, elle m'a été très utile.
elle mérite au moins un 8/10
Krazymins
Messages postés
1
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
23 mars 2009
-
Bonjour tout le monde,

comment faire pour placer les dossier dans le zip et ne pas tout avoir à la racine du zip svp ? (garder l'arborescence du dossier que l'on veut zipper)

Thanks
sheorogath
Messages postés
2465
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
11 -
tout mettre en final n'est peut etre pas la peine d'en mettre autant
tarzent
Messages postés
30
Date d'inscription
vendredi 12 juillet 2002
Statut
Membre
Dernière intervention
15 mai 2009
-
Salut tout le monde,

'final' c'est de l'optimisation. Je vois qu'il y a toujours autant de monde qui les connaît...

Il y a effectivement plusieurs constructeurs pour compress et decompress : en fonction de ce que vous avez sous la main (un objet File, une String...) vous utilisez plutôt l'un ou l'autre.

++
Karibou38
Messages postés
1
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
18 mars 2008
-
J'avais juste besoin d'une fonction pour dézipper un fichier et ton code marche parfaitement :)
Merci

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.