Aujourd’hui, nous examinerons un exemple de fichier zip Java. Nous compresserons également un dossier et créerons un fichier zip à l’aide d’un programme Java.
Java ZIP
java.util.zip.ZipOutputStream
peut être utilisé pour compresser un fichier au format ZIP. Étant donné qu’un fichier zip peut contenir plusieurs entrées, ZipOutputStream utilise java.util.zip.ZipEntry
pour représenter une entrée de fichier zip.
Fichier ZIP Java
La création d’une archive zip pour un seul fichier est très simple, nous devons créer un objet ZipOutputStream à partir de l’objet FileOutputStream du fichier de destination. Ensuite, nous ajoutons une nouvelle entrée ZipEntry à ZipOutputStream et utilisons FileInputStream pour lire le fichier source vers l’objet ZipOutputStream. Une fois l’écriture terminée, nous devons fermer ZipEntry et libérer toutes les ressources.
Dossier Zip Java
Zipper un répertoire est un peu délicat, d’abord nous devons obtenir la liste des fichiers en tant que chemin absolu. Ensuite, traitons chacun d’eux séparément. Nous devons ajouter un ZipEntry pour chaque fichier et utiliser FileInputStream pour lire le contenu du fichier source dans le ZipEntry correspondant à ce fichier.
Exemple de Zip Java
Voici le programme Java montrant comment compresser un seul fichier ou un dossier en Java.
package com.journaldev.files;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFiles {
List filesListInDir = new ArrayList();
public static void main(String[] args) {
File file = new File("/Users/pankaj/sitemap.xml");
String zipFileName = "/Users/pankaj/sitemap.zip";
File dir = new File("/Users/pankaj/tmp");
String zipDirName = "/Users/pankaj/tmp.zip";
zipSingleFile(file, zipFileName);
ZipFiles zipFiles = new ZipFiles();
zipFiles.zipDirectory(dir, zipDirName);
}
/**
* This method zips the directory
* @param dir
* @param zipDirName
*/
private void zipDirectory(File dir, String zipDirName) {
try {
populateFilesList(dir);
//maintenant, compressons les fichiers un par un
//créer ZipOutputStream pour écrire dans le fichier zip
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
//pour ZipEntry, nous devons conserver uniquement le chemin relatif du fichier, nous avons donc utilisé la sous-chaîne sur le chemin absolu
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
//lire le fichier et écrire dans ZipOutputStream
FileInputStream fis = new FileInputStream(filePath);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
fis.close();
}
zos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* This method populates all the files in a directory to a List
* @param dir
* @throws IOException
*/
private void populateFilesList(File dir) throws IOException {
File[] files = dir.listFiles();
for(File file : files){
if(file.isFile()) filesListInDir.add(file.getAbsolutePath());
else populateFilesList(file);
}
}
/**
* This method compresses the single file to zip format
* @param file
* @param zipFileName
*/
private static void zipSingleFile(File file, String zipFileName) {
try {
//créer ZipOutputStream pour écrire dans le fichier zip
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
//ajouter une nouvelle entrée Zip au ZipOutputStream
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
//lire le fichier et écrire dans ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
//Fermer l'entrée zip pour écrire dans le fichier zip
zos.closeEntry();
//Fermer les ressources
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
La sortie du programme d’exemple de compression Java ci-dessus est :
/Users/pankaj/sitemap.xml is zipped to /Users/pankaj/sitemap.zip
Zipping /Users/pankaj/tmp/.DS_Store
Zipping /Users/pankaj/tmp/data/data.dat
Zipping /Users/pankaj/tmp/data/data.xml
Zipping /Users/pankaj/tmp/data/xmls/project.xml
Zipping /Users/pankaj/tmp/data/xmls/web.xml
Zipping /Users/pankaj/tmp/data.Xml
Zipping /Users/pankaj/tmp/DB.xml
Zipping /Users/pankaj/tmp/item.XML
Zipping /Users/pankaj/tmp/item.xsd
Zipping /Users/pankaj/tmp/ms/data.txt
Zipping /Users/pankaj/tmp/ms/project.doc
Remarquez que lors de l’enregistrement des fichiers dans le répertoire zip, j’affiche le chemin absolu. Mais lors de l’ajout de l’entrée zip, j’utilise le chemin relatif du répertoire afin que lors du dézippage, il recréera la même structure de répertoire. C’est tout pour l’exemple de compression Java.
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example