Descompactador - Muito loco [Resolvido]

3 respostas
KaosBr

Boa noite,

Estou tabalhando em uma classe que descompacta, porém, está totalmente fora do ideal.

1- Arquivo de 5K copactado pelo windows no formato zip. Ficou com 2K de tamanho, mas apos descompactar com o java ficou com 366K e ilegivel.

2- Uma pasta com arquivos. Todos os arquivos depois de compactados somaram, 666KB. Apos descompactar com o sistema, todos os arquivos, internos do zip ficaram com 1KB e ilegiveis.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

/**
 *
 * @author Kaos
 */
public class Descompactador {
    private String nomeDoArquivo;
    private String nomeDoDiretorio;
    private File file;
    private File diretorio;
    private ZipFile zipFile;
    private ZipEntry zipEntry;
    private int bytesLidos;
    private InputStream inputStream;
    private OutputStream outputStream;
    private byte[] buffer;

    public Descompactador(
            String informeNomeDoArquivo,
            String informeDiretorio
            ) {
        this.nomeDoArquivo = informeNomeDoArquivo;
        this.nomeDoDiretorio = informeDiretorio;
        this.file = null;
        this.zipFile = null;
        this.inputStream = null;
        this.outputStream = null;
        this.zipEntry = null;
        this.bytesLidos = 0;
        this.buffer = new byte[8192]; // 16KB = 16384 / 8KB = 8192 / 4KB = 4096
    }

    public void descompactaArquivo() throws IOException {
        // Cria referencia ao diretorio.
        this.diretorio = new File(this.nomeDoDiretorio);

        // Verifica se o diretorio existe caso não o cria.
        if(!this.diretorio.exists()) {
            this.diretorio.mkdir();
        }

        // Verifica se o arquivo informado realmente é diretorio.
        // Caso não seja, gera, erro de saida.
        if(!this.diretorio.isDirectory()) {
            throw new IOException("Destino invalido!");
        }

        // Carrega arquivo compactado em buffer.
        this.zipFile = new ZipFile(this.nomeDoArquivo);

        // Prepara um Enumeration para ser usado na iteração.
        Enumeration e = this.zipFile.entries();

        // Trata todas as saidas do arquivo.
        while(e.hasMoreElements()) {
            // Recebe o item para ser tratado pelo descompactador.
            this.zipEntry = (ZipEntry) e.nextElement();

            // Cria uma referencia a um arquivo na pasta informada.
            this.file = new File(this.diretorio, this.zipEntry.getName());

            // Caso seja uma pasta e não exista o cria.
            if(this.zipEntry.isDirectory() && !this.file.exists()) {
                this.file.mkdir();
                continue;
            }

            // Cria arquivo pai caso não exista.
            if(!this.file.getParentFile().exists()) {
                this.file.getParentFile().mkdir();
            }

            // Le arquivo em buffer e cria em disco.
            try {
                // Pega saida e armeza em stream para manipulação.
                this.inputStream = this.zipFile.getInputStream(this.zipEntry);
                // Prepara a saida gerando o arquivo.
                this.outputStream = new FileOutputStream(this.file);

                if(this.inputStream == null) {
                    // Gera erro caso buffer seja invalido.
                    throw new ZipException(
                            // Mensagem de aviso.
                            "Erro ao ler arquivo: " + this.zipEntry.getName()
                            );
                }

                // Armazena o tamanho do buffer, enquanto é feito, a leitura.
                // Servindo de parametro para criação do arquivo.
                // ((this.bytesLidos = this.inputStream.read()) > 0)
                while((this.bytesLidos = this.inputStream.read()) > 0) {
                    this.outputStream.write(this.buffer, 0, this.bytesLidos);
                }
            } finally {

                if(this.inputStream != null) {
                    this.inputStream.close();
                }

                if(this.outputStream != null) {
                    this.outputStream.close();
                }


            }
        }
    }

}

[]s

3 Respostas

ViniGodoy

Já tentou abrir com o Winzip o arquivo compactado para ver se foi gerado corretamente?

KaosBr

Boa noite, Vini.

Descompactando pela ferramenta do proprio windows, os arquivos estão corretos.

[]s

KaosBr

Bom dia,

Achei o problema :slight_smile: Era a linha, 100, do código que passei. Fiz o ajuste abaixo e funcionou:

while((this.bytesLidos = this.inputStream.read(this.buffer)) > 0) {

Obrigado.

[]s

Criado 18 de dezembro de 2010
Ultima resposta 19 de dez. de 2010
Respostas 3
Participantes 2