Exemplo de Pasta de Arquivo Zip em Java

Hoje vamos olhar para um exemplo de arquivo zip em java. Vamos também comprimir uma pasta e criar um arquivo zip usando um programa java.

Java ZIP

java.util.zip.ZipOutputStream pode ser usado para comprimir um arquivo no formato ZIP. Como um arquivo zip pode conter múltiplas entradas, ZipOutputStream usa java.util.zip.ZipEntry para representar uma entrada de arquivo zip.

Arquivo ZIP Java

Criar um arquivo zip para um único arquivo é muito fácil, precisamos criar um objeto ZipOutputStream a partir do objeto FileOutputStream do arquivo de destino. Então, adicionamos uma nova ZipEntry ao ZipOutputStream e usamos FileInputStream para ler o arquivo fonte para o objeto ZipOutputStream. Uma vez que terminamos de escrever, precisamos fechar ZipEntry e liberar todos os recursos.

Pasta Zip Java

Zipear um diretório é um pouco complicado, primeiro precisamos obter a lista de arquivos como caminho absoluto. Em seguida, processamos cada um separadamente. Precisamos adicionar um ZipEntry para cada arquivo e usar o FileInputStream para ler o conteúdo do arquivo de origem para o ZipEntry correspondente a esse arquivo.

Exemplo de Zip em Java

Aqui está o programa em Java que mostra como compactar um único arquivo ou compactar uma pasta em 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);
            // agora compacta os arquivos um por um
            // cria o ZipOutputStream para escrever no arquivo zip
            FileOutputStream fos = new FileOutputStream(zipDirName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            for(String filePath : filesListInDir){
                System.out.println("Zipping "+filePath);
                // para o ZipEntry, precisamos manter apenas o caminho relativo do arquivo, então usamos substring no caminho absoluto
                ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
                zos.putNextEntry(ze);
                // lê o arquivo e escreve no 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 {
            // cria o ZipOutputStream para escrever no arquivo zip
            FileOutputStream fos = new FileOutputStream(zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            // adiciona um novo Zip Entry ao ZipOutputStream
            ZipEntry ze = new ZipEntry(file.getName());
            zos.putNextEntry(ze);
            // lê o arquivo e escreve no ZipOutputStream
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            
            // fecha o zip entry para escrever no arquivo zip
            zos.closeEntry();
            // fecha os recursos
            zos.close();
            fis.close();
            fos.close();
            System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
            
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

A saída do exemplo de programa zip em Java acima é:

/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

Observe que ao registrar os arquivos no zip no diretório, estou imprimindo o caminho absoluto. Mas ao adicionar a entrada zip, estou usando o caminho relativo do diretório, para que, ao descompactá-lo, ele crie a mesma estrutura de diretório. Isso é tudo para o exemplo de zip em Java.

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