CheatsNaNet
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Arquivos ZIP em Java

Ir para baixo

Arquivos ZIP em Java Empty Arquivos ZIP em Java

Mensagem por Freak Qui Jan 06, 2011 12:56 pm

Compactando arquivos com Java

Java possui um pacote de classes que permitem compactação de dados. Vejamos como é fácil compactar todos os arquivos de uma pasta.

O primeiro passo é importar as classes que usaremos:
Código:

 [list=1][*]import java.io.*;[*] import java.util.zip.*;[/list]import java.io.*; import java.util.zip.*;

Do pacote java.io usaremos classes para manipular fluxos (streams) de entrada e saída de dados. Ao passo que no pacote java.util.zip estão as classes que farão a compactação
dos dados.
É recomendado estudar a documentação desses dois pacotes, facilitará o entendimento.
java.util.zip (Java 2 Platform SE v1.4.2)
java.io (Java 2 Platform SE v1.4.2)

Vamos ao código e depois daremos uma passada nas partes importantes.
Código:

[list=1][*]package br.com.javafree.tutoriais.arquivosZipEmJava;[*][*]import java.io.*;[*]import java.util.zip.*;[*][*]public class Compactador {[*][*] // ------------------------------------------------ Constantes[*] static final int TAMANHO_BUFFER = 2048; // 2kb[*][*][*] // ------------------------------------------------ Métodos públicos[*] public void compactar (String arqSaida) {[*] int i, cont;[*] byte[] dados = new byte[TAMANHO_BUFFER];[*] String arquivos[];[*] File f = null;[*] BufferedInputStream origem = null;[*] FileInputStream streamDeEntrada = null;[*] FileOutputStream destino = null;[*] ZipOutputStream saida = null;[*] ZipEntry entry = null;[*][*] try {[*] destino = new FileOutputStream(arqSaida);[*] saida = new ZipOutputStream(new BufferedOutputStream(destino));[*] f = new File("."); // Todos os arquivos da pasta onde a classe está[*] arquivos = f.list();[*][*] for (i = 0; i < arquivos.length; i++) {[*] File arquivo = new File(arquivos[i]);[*][*] if (arquivo.isFile() && !(arquivo.getName()).equals(arqSaida)) {[*] System.out.println("Compactando: " + arquivos[i]);[*][*] streamDeEntrada = new FileInputStream(arquivo);[*] origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);[*] entry = new ZipEntry(arquivos[i]);[*] saida.putNextEntry(entry);[*][*] while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {[*] saida.write(dados, 0, cont);[*] }[*][*] origem.close();[*] }[*] }[*][*] saida.close();[*][*] } catch(Exception e) {[*] e.printStackTrace();[*] }[*] }//fim compactar()[*]}//Compactador.class[/list]package br.com.javafree.tutoriais.arquivosZipEmJava; import java.io.*; import java.util.zip.*; public class Compactador { // ------------------------------------------------ Constantes static final int TAMANHO_BUFFER = 2048; // 2kb // ------------------------------------------------ Métodos públicos public void compactar (String arqSaida) { int i, cont; byte[] dados = new byte[TAMANHO_BUFFER]; String arquivos[]; File f = null; BufferedInputStream origem = null; FileInputStream streamDeEntrada = null; FileOutputStream destino = null; ZipOutputStream saida = null; ZipEntry entry = null; try { destino = new FileOutputStream(arqSaida); saida = new ZipOutputStream(new BufferedOutputStream(destino)); f = new File("."); // Todos os arquivos da pasta onde a classe está arquivos = f.list(); for (i = 0; i < arquivos.length; i++) { File arquivo = new File(arquivos[i]); if (arquivo.isFile() && !(arquivo.getName()).equals(arqSaida)) { System.out.println("Compactando: " + arquivos[i]); streamDeEntrada = new FileInputStream(arquivo); origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER); entry = new ZipEntry(arquivos[i]); saida.putNextEntry(entry); while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) { saida.write(dados, 0, cont); } origem.close(); } } saida.close(); } catch(Exception e) { e.printStackTrace(); } }//fim compactar() }//Compactador.class 

Esta é a nossa classe Compactador, percebe-se que usaremos seu método compactar() para compactar todos os arquivos da pasta onde nossa classe está. Para usar o método é necessário instanciar um objeto da classe, por exemplo:
Código:

[list=1][*]Compactador compactador = new Compactador();[*]compactador.compactar(...);[/list]Compactador compactador = new Compactador(); compactador.compactar(...); 

O método recebe uma String como argumento com o nome do arquivo a ser criado. Ex.:"arquivo.zip".

1.1 Armazenadores

Vamos dar uma geral nas variáveis do método compactar.
Código:

[list=1][*] int i, cont;[*] // Contadores.[*][*] byte[] dados = new byte[TAMANHO_BUFFER];[*] // Este array receberá os bytes lidos do arquivo a ser compactado.[*] // Veja que TAMANHO_BUFFER foi declarado como uma constante inteira de valor 2048, logo, o arquivo[*] // será lido de 2 em 2 KB. Você pode optar por ler blocos maiores ou menores, sem problema.[*][*] String arquivos[];[*] // Receberá a lista dos arquivos a serem compactados.[*][*] File f = null;[*] // f nos dará informações sobre a pasta (entrada) em que se encontra a classe.[*][*] BufferedInputStream origem = null;[*] FileInputStream streamDeEntrada = null;[*] FileOutputStream destino = null;[*][*] // Streams de entrada e saída. (Vide documentação do pacote java.io)[*][*] ZipOutputStream saida = null;[*] // saida será usada para gravar nossos dados de forma comprimida.[*][*] ZipEntry entry = null;[*] // Cada entrada do nosso arquivo ZIP[/list] int i, cont; // Contadores. byte[] dados = new byte[TAMANHO_BUFFER]; // Este array receberá os bytes lidos do arquivo a ser compactado. // Veja que TAMANHO_BUFFER foi declarado como uma constante inteira de valor 2048, logo, o arquivo // será lido de 2 em 2 KB. Você pode optar por ler blocos maiores ou menores, sem problema. String arquivos[]; // Receberá a lista dos arquivos a serem compactados. File f = null; // f nos dará informações sobre a pasta (entrada) em que se encontra a classe. BufferedInputStream origem = null; FileInputStream streamDeEntrada = null; FileOutputStream destino = null; // Streams de entrada e saída. (Vide documentação do pacote java.io) ZipOutputStream saida = null; // saida será usada para gravar nossos dados de forma comprimida. ZipEntry entry = null; // Cada entrada do nosso arquivo ZIP 

1.2 Primeira parte importante
Código:

[list=1][*][*][*] destino = new FileOutputStream(arqSaida);[*] saida = new ZipOutputStream(new BufferedOutputStream(destino));[*][*] f = new File(".");[*] arquivos = f.list();[/list] destino = new FileOutputStream(arqSaida); saida = new ZipOutputStream(new BufferedOutputStream(destino)); f = new File("."); arquivos = f.list();
 
Aqui é criado o objeto saida que será usado para gravar o nosso arquivo ZIP. Nesta parte também criamos o array arquivos que recebe a lista dearquivos e subpastas da pasta onde a classe se encontra.

1.3 Compactação

Para serem compactado, os arquivos têm que ser abertos, lidos e seus conteúdos escritos como entrada (entry) no arquivo ZIP. Isto é feito, arquivo por arquivo, percorrendo os elementos do array arquivos. É o que vemos no código abaixo.
Código:

[list=1][*]for (i = 0; i < arquivos.length; i++) {[*] File arquivo = new File(arquivos[i]);[*][*] if (arquivo.isFile() && !(arquivo.getName()).equals(arqSaida)) {[*] System.out.println("Compactando:" + arquivos[i]);[*][*] streamDeEntrada = new FileInputStream(arquivo);[*] origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);[*] entry = new ZipEntry(arquivos[i]);[*] saida.putNextEntry(entry);[*][*] while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {[*] saida.write(dados, 0, cont);[*] }[*][*] origem.close();[*] }[*]}[/list]for (i = 0; i < arquivos.length; i++) { File arquivo = new File(arquivos[i]); if (arquivo.isFile() && !(arquivo.getName()).equals(arqSaida)) { System.out.println("Compactando:" + arquivos[i]); streamDeEntrada = new FileInputStream(arquivo); origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER); entry = new ZipEntry(arquivos[i]); saida.putNextEntry(entry); while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) { saida.write(dados, 0, cont); } origem.close(); } }
 
Veja que estamos compactando somente os arquivos da pasta, ignorando suas subpastas. Você poderia exercitar-se mudando isto Smile .

O fragmento abaixo merece uma atenção especial.
Código:

[list=1][*]entry = new ZipEntry(arquivos[i]);[*]saida.putNextEntry(entry);[/list]entry = new ZipEntry(arquivos[i]); saida.putNextEntry(entry); 

É aqui que dizemos para saida que estamos enviando um novo arquivo (entrada).
Depois de informamos isto, podemos gravar (de 2 em 2 KB, lembra?) os dados no arquivo ZIP.
Código:

[list=1][*]while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {[*] saida.write(dados, 0, cont);[*]}[/list]while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) { saida.write(dados, 0, cont); } 
 
1.4 Observações finais
O resto do código é bastante simples, vale lembrar que sempre após ler ou gravar um arquivo, o seu stream deve ser fechado (origem.close(), saida.close()).
Enfim, um código bem simples que pode ser muito bem explorado em aplicações diversas.

Freak
Freak
Membro
Membro

Mensagens : 134
Agradecimentos : 7
Data de inscrição : 02/01/2011

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos