Compactando arquivos com Java

Certo dia em algum sistema seu que gera arquivos o tempo (e que não pode parar de fazer isso!), você percebe que está ficando sem espaço no servidor, e não pode simplesmentes remover esses arquivos, é necessário que os arquivos permanecem por um bom tempo, tempo o suficiente para acabar com o espaço que você tem, ai sim, você começa a ter um problema.

Bom, pensando nisso comecei a estudar compactação de arquivos, e achei algumas coisas bem interessantes, abaixo está um exemplo de como compactar N arquivos de um diretório, fiz com Java pois estou estudando um pouco essa tecnologia, mas vou postar um exemplo em Dot Net também.

A explicação de como funciona está dentro do código, espero que seja útil à comunidade.

package br.com.ZipA;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Exemplo {
public static void main(String[] args) {

// vetor para guardar os arquivos que serão compactados
String[] arquivosEleitosParaCompactacao = new String[3];
arquivosEleitosParaCompactacao[0] = "C:\\Users\\o.casagrande\\Oscar\\estudo\\1.txt";
arquivosEleitosParaCompactacao[1] = "C:\\Users\\o.casagrande\\Oscar\\estudo\\2.txt";
arquivosEleitosParaCompactacao[2] = "C:\\Users\\o.casagrande\\Oscar\\estudo\\3.txt";

byte[] buffer = new byte[1024];

// caminho do arquivo compactado
String arquivoCompactado = "C:\\Users\\o.casagrande\\Oscar\\estudo\\ZipA.zip";

try {

// cria o arquivo zip
ZipOutputStream saidaDeStream = new ZipOutputStream(new FileOutputStream(arquivoCompactado));

// marca o modo de compreensão do arquivo
saidaDeStream.setLevel(Deflater.BEST_COMPRESSION);

// laço para pegar todos os arquivos que serao zipados
for (int i = 0; i < arquivosEleitosParaCompactacao.length; i++)
{
// carrega o arquivo em um stream
FileInputStream entradaDeStream = new FileInputStream(arquivosEleitosParaCompactacao[i]);

// cria uma entrada no zip para o arquivo
saidaDeStream.putNextEntry(new ZipEntry(arquivosEleitosParaCompactacao[i]));

// transfere os dados do arquivo para o zip
int tamanhoArquivo;
while ((tamanhoArquivo = entradaDeStream.read(buffer)) > 0)
{
saidaDeStream.write(buffer, 0, tamanhoArquivo);
}

// fecha a entrada do arquivo no zip
saidaDeStream.closeEntry();

// fecha o arquivo
entradaDeStream.close();
}

// fecha o arquivo zip
saidaDeStream.close();

} catch (Exception e) {

}
}
}
Anúncios