Este artigo pretende apresentar uma classe utilitária que “zippa” um arquivo existente.

Abaixo segue nossa classe CompactadorZip:

Listagem 1: Classe Compactador

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.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Compactador {
   
   //Constantes
   static final int TAMANHO_BUFFER = 4096; // 4kb
   
   //método para compactar arquivo
   public static void compactarParaZip(String arqSaida,String arqEntrada)
throws IOException{
       int cont;
       byte[] dados = new byte[TAMANHO_BUFFER];
                   
       BufferedInputStream origem = null;
       FileInputStream streamDeEntrada = null;
       FileOutputStream destino = null;
       ZipOutputStream saida = null;
       ZipEntry entry = null;
              
       try {
            destino = new FileOutputStream(new File(arqSaida));
            saida = new ZipOutputStream(new BufferedOutputStream(destino));
            File file = new File(arqEntrada);
            streamDeEntrada = new FileInputStream(file);
            origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);
            entry = new ZipEntry(file.getName());
            saida.putNextEntry(entry);
                       
            while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {
                saida.write(dados, 0, cont);
            }
            origem.close();
            saida.close();
        } catch(IOException e) {
            throw new IOException(e.getMessage());
        }
   }
}

São passados como paramêtros para o método compactarParaZip duas strings, o caminho completo do arquivo de saída e também do arquivo de entrada. Nesta classe usamos: BufferedInputStream, FileInputStream, FileOutputStream, ZipOutputStream e ZipEntry.

Alguns conceitos:

  • BufferedInputStream: usado para armazenar dados de um fluxo de entrada;
  • FileInputStream: usado para ler arquivos.

O FileOutputStream é um fluxo de arquivo que permite a gravação em disco, já o FileInputStream é justamente o contrário, permitindo a leitura de um arquivo em disco.

ZipOutputStream e ZipEntry são usados para “zippar” o arquivo. Para maiores informações seguem os links da documentação:

Abaixo segue um exemplo de código para testarmos nossa implementação anterior:

Listagem 2: Utilizando a classe criada para compactar um arquivo

import java.io.IOException;

public class Main {
   
   public static void main(String args[]){
       try {
           Compactador.compactarParaZip("C:\\zipado.zip", "C:\\zipando.txt");
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
   }

}

Como pode se observar, essa implementação é bem simples. Com esse artigo esperamos atender a todos que precisarem “zippar” seus arquivos sem a necessidade de importar nenhum jar.