descompactando arquivos em java
TRANSCRIPT
Descompactando arquivos .ZIP com o Java01 de setembro de 2003 por Christiano Pinheiro
Olá, pessoal.
Desculpem-me pela demora na coluna mas tive alguns
problemas de saúde e no trabalho que me impossibilitaram de finalizar
a tempo a mesma. No artigo desta semana veremos como descompactar
um arquivo ZIP.
O pacote java.util.zip package contém várias classes
que facilitam a manipulação de arquivos compactados. É nele que
trabalharemos no artigo desta semana. Let’s rock!
A classe ZipFile
A classe ZipFile fornece um modo de ler o conteúdo
de um arquivo ZIP. Existem dois construtores: um que recebe a
String especificando o nome do arquivo a ser aberto e outro que
recebe um objeto do tipo java.io.File.
A classe ZipEntry
Cada arquivo contido no arquivo ZIP pode ser representado
por um objeto do tipo ZipEntry. Estes objetos podem ser obtidos
de um arquivo existente através de um objeto do tipo ZipFile ou
ZipIputStream. Eles podem também ser criados quando fazemos um
novo arquivo ZIP através do ZipOutputStream.
A Classe ZipEntry fornece métodos para obter informações
sobre cada entrada de arquivo no ZIP, como o método isDirectory(),
que determina se a entrada é de um arquivo normal ou diretório.
A classe ZipInputStream
A classe ZipInputStream lê dados no formato ZIP
de uma InputStream.
O método getNextEntry() retorna um ZipEntry para
o próximo item no arquivo ZIP e posiciona a stream no início dos
dados para o componente.
O método closeEntry() fecha o item corrente e segue
para o próximo item do arquivo.
Ambos os métodos geram uma exceção do tipo ZipException
caso ocorra alguma relacionada com operações de ZIP no arquivo.
A classe ZipOutputStream
A classe ZipOutputStream fornece uma OuputStream
para gerarmos dados comprimidos.
O método putNextEntry() recebe um ZipEntry como
parâmetro para criação de uma nova entrada no arquivo ZIP.
Para especificar o tipo de compressão utilizada,
existem dois métodos:
.
setMethod() – recebe um parâmetro do
tipo ZipOutputStream.DEFLATED(para especificar que deverá haver
compressão) ou ZipOutputStream.STORED(não haverá compressão)
. setLevel()
– recebe um parâmetro do tipo int (0a 9) especificando o nível
de compressão
Vejamos agora como descompactar o arquivo ZIP de
modo completo, criando diretórios e tudo mais.
Note que no exemplo a seguir criamos um método chamado copyInputStream()
que será o responsável por gravar a InputStream referente ao item
do arquivo ZIP.
Ex.:
import java.io.*;import java.util.*;import java.util.zip.*;
public class Unzip {
public static final void copyInputStream(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int len; while((len = in.read(buffer)) >= 0) out.write(buffer, 0, len); in.close(); out.close(); }
public static final void main(String[] args) {
Enumeration entries; ZipFile zipFile;
if(args.length != 1) { System.err.println("Sintaxe do programa: Unzip arquivo"); return; } try { zipFile = new ZipFile(args[0]); entries = zipFile.entries(); while(entries.hasMoreElements()) { ZipEntry entry = (ZipEntry)entries.nextElement(); if(entry.isDirectory()) { System.err.println("Descompactando diretório: " + entry.getName()); (new File(entry.getName())).mkdir(); continue; } System.out.println("Descompactando arquivo:" + entry.getName()); copyInputStream(zipFile.getInputStream(entry), new BufferedOutputStream(new FileOutputStream(entry.getName()))); } zipFile.close(); } catch (IOException ioe) { System.err.println("Erro ao descompactar:" + ioe.getMessage()); return; } }}
Um abraço e até a próxima!