Descompactação de um arquivo .gz

4 respostas
R

Boa tarde pessoal,

Estou com dificuldades para descompactar um arquivo.gz, ele nao esta no formato arquivo.tar.gz, somente .gz.

Alguem tem a rotina ou um tutorial ai pra me ajudar ?

Grato!!!

4 Respostas

T

Use GZipInputStream. É fácil, só que você precisa saber se o tal arquivo foi realmente compactado corretamente com gzip.

Que tal pegar o tal arquivo .gz e descompactá-lo “por fora” para ver se o formato está OK mesmo?

R

Então estou usando o winRar e esta descompactando Ok, porem nao estou consseguindo descompactar.
:frowning:

T
import java.util.*;
import java.util.zip.*;
import java.io.*;
import java.security.*;

class TesteGZIPInputStream {
    /** Cria um arquivo de teste. Para que o arquivo seja compressível, devemos gerar dados aleatórios, mas não tanto. 
        Uma forma de fazer isso é criar um array grande, cheio de zeros, e preencher aleatoriamente apenas 
        20% desse array com dados aleatórios. */
    public void criarArquivoTeste (File arq, int nBytes) throws IOException {
        byte[] bytes = new byte[nBytes]; // criando o array cheio de zeros
        Random r = new Random();
        for (int n = nBytes / 5; n >= 0; --n) {
            bytes[r.nextInt (nBytes)] = (byte) r.nextInt();
        }
        OutputStream os = new FileOutputStream (arq);
        os.write (bytes);
        os.close();
    }
    /** Comprime o arquivo */
    public void comprimir (File original, File comprimido) throws IOException {
        if (original.getAbsoluteFile().equals(comprimido.getAbsoluteFile())) {
            throw new IllegalArgumentException ("O arquivo de origem e o de destino não podem ser o mesmo");
        }
        InputStream is = new FileInputStream (original);
        GZIPOutputStream gzos = new GZIPOutputStream (new FileOutputStream (comprimido));
        byte[] buffer = new byte[16 * 1024];
        for (int nBytesLidos = is.read (buffer); nBytesLidos > 0; nBytesLidos = is.read(buffer)) {
            gzos.write (buffer, 0, nBytesLidos);
        }
        is.close();
        gzos.close();
    }
    /** Descomprime o arquivo */
    public void descomprimir (File comprimido, File descomprimido) throws IOException {
        if (comprimido.getAbsoluteFile().equals(descomprimido.getAbsoluteFile())) {
            throw new IllegalArgumentException ("O arquivo de origem e o de destino não podem ser o mesmo");
        }
        GZIPInputStream gzis = new GZIPInputStream (new BufferedInputStream (new FileInputStream (comprimido)));
        OutputStream os = new BufferedOutputStream (new FileOutputStream (descomprimido));
        byte[] buffer = new byte[16 * 1024];
        for (int nBytesLidos = gzis.read (buffer); nBytesLidos > 0; nBytesLidos = gzis.read(buffer)) {
            os.write (buffer, 0, nBytesLidos);
        }
        gzis.close();
        os.close();
    }
    
    /** 
     Retorna true se os arquivos forem iguais, e false em caso contrário. Na verdade
     iremos conferir apenas os digests de ambos os arquivos, porque isso costuma ser bem mais rápido
     que conferir byte por byte. 
     */
    public boolean conferirArquivo (File arq1, File arq2) throws Exception {
        byte[] digest1 = digestArquivo (arq1);
        byte[] digest2 = digestArquivo (arq2);
        return Arrays.equals (digest1, digest2);
    }
    
    public byte[] digestArquivo (File arq) throws Exception {
        MessageDigest sha512 = MessageDigest.getInstance ("SHA-512");
        DigestInputStream dis = new DigestInputStream (new BufferedInputStream (new FileInputStream (arq)), sha512);
        byte[] buffer = new byte[16 * 1024];
        for (int nBytesLidos = dis.read (buffer); nBytesLidos > 0; nBytesLidos = dis.read (buffer)) {
        }
        dis.close();
        return sha512.digest();
    }

    public static void main(String[] args) throws Exception {
        TesteGZIPInputStream t = new TesteGZIPInputStream();
        t.criarArquivoTeste (new File ("teste.txt"), 1024 * 1024 + 237);
        t.comprimir (new File ("teste.txt"), new File ("teste.txt.gz"));
        t.descomprimir (new File ("teste.txt.gz"), new File ("teste.txt.2"));
        System.out.println (t.conferirArquivo (new File ("teste.txt"), new File ("teste.txt.2")));
    }
}
R

Uma versão um pouco mais simplificada.

try {
        // Open the compressed file
        String inFilename = "infile.gzip";
        GZIPInputStream in = new GZIPInputStream(new FileInputStream(inFilename));
    
        // Open the output file
        String outFilename = "outfile";
        OutputStream out = new FileOutputStream(outFilename);
    
        // Transfer bytes from the compressed file to the output file
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
    
        // Close the file and stream
        in.close();
        out.close();
    } catch (IOException e) {
    }
Criado 18 de outubro de 2007
Ultima resposta 19 de out. de 2007
Respostas 4
Participantes 2