Esempio di cartella di file zip Java

Oggi esamineremo un esempio di file zip in java. Comprimeremo anche una cartella e creeremo un file zip utilizzando un programma java.

Java ZIP

java.util.zip.ZipOutputStream può essere utilizzato per comprimere un file in formato ZIP. Poiché un file zip può contenere più voci, ZipOutputStream utilizza java.util.zip.ZipEntry per rappresentare una voce di file zip.

File ZIP Java

Creare un archivio zip per un singolo file è molto facile, dobbiamo creare un oggetto ZipOutputStream dall’oggetto FileOutputStream del file di destinazione. Poi aggiungiamo una nuova ZipEntry al ZipOutputStream e usiamo FileInputStream per leggere il file sorgente all’oggetto ZipOutputStream. Una volta terminata la scrittura, dobbiamo chiudere ZipEntry e rilasciare tutte le risorse.

Zip della Cartella Java

Comprimere una directory è un po’ complicato, prima dobbiamo ottenere l’elenco dei file come percorso assoluto. Poi elaboriamo ciascuno di essi separatamente. Dobbiamo aggiungere un ZipEntry per ogni file e utilizzare FileInputStream per leggere il contenuto del file di origine nel ZipEntry corrispondente a quel file.

Esempio di Zip in Java

Ecco il programma java che mostra come comprimere un singolo file o comprimere una cartella in 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);
            //ora comprimi i file uno per uno
            //crea ZipOutputStream per scrivere nel file zip
            FileOutputStream fos = new FileOutputStream(zipDirName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            for(String filePath : filesListInDir){
                System.out.println("Zipping "+filePath);
                //per ZipEntry dobbiamo mantenere solo il percorso relativo del file, quindi abbiamo usato substring sul percorso assoluto
                ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
                zos.putNextEntry(ze);
                //leggi il file e scrivi su 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 {
            //crea ZipOutputStream per scrivere nel file zip
            FileOutputStream fos = new FileOutputStream(zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            //aggiungi una nuova voce Zip al ZipOutputStream
            ZipEntry ze = new ZipEntry(file.getName());
            zos.putNextEntry(ze);
            //leggi il file e scrivi su ZipOutputStream
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            
            //Chiudi l'entrata zip per scrivere sul file zip
            zos.closeEntry();
            //Chiudi le risorse
            zos.close();
            fis.close();
            fos.close();
            System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
            
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

L’output del programma di esempio zip java sopra è:

/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

Nota che mentre registro i file da comprimere nella directory, sto stampando il percorso assoluto. Ma mentre aggiungo l’entry zip, sto utilizzando il percorso relativo dalla directory in modo che quando lo decomprimiamo, verrà creata la stessa struttura delle directory. Questo è tutto per l’esempio di zip in Java.

Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example