Java.util.zip

4 respostas
Leco2

Bom dia,

Estou utilizando essa api para compactar alguns arquivos em xmls, mas estou com um problema.
Eu consigo criar o arquivo zipado sem problemas, mas na hora de descompactar via código o arquivo que compactei vem incompleto.

Esse é meu código para descompactar o arquivo

FileInputStream fis = new FileInputStream(arquivo);
            ZipInputStream zis = new ZipInputStream(fis);
            ZipEntry ze = zis.getNextEntry();

            byte[] buffer = new byte[1024];
            //Preenche o buffer com os dados
            zis.read(buffer);

            String xml = new String(buffer, "UTF-8");

            System.out.println(xml);

            zis.close();

Na hora de descompactar eu não quero criar um arquivo físico, por isso eu coloco ele em um byte[].
Mas quando imprimo o resultado só veio metade do arquivo que compactei originalmente.
Oque estou fazendo de errado nessa leitura?

Obs.: Se eu descompacto o arquivo usando winrar eu abro o xml e ele está completo lá, então tenho certeza que estou compactando o arquivo da maneira correta.

4 Respostas

rmendes08

Leco:
Bom dia,

Estou utilizando essa api para compactar alguns arquivos em xmls, mas estou com um problema.
Eu consigo criar o arquivo zipado sem problemas, mas na hora de descompactar via código o arquivo que compactei vem incompleto.

Esse é meu código para descompactar o arquivo

FileInputStream fis = new FileInputStream(arquivo);
            ZipInputStream zis = new ZipInputStream(fis);
            ZipEntry ze = zis.getNextEntry();

            byte[] buffer = new byte[1024];
            //Preenche o buffer com os dados
            zis.read(buffer);

            String xml = new String(buffer, "UTF-8");

            System.out.println(xml);

            zis.close();

Na hora de descompactar eu não quero criar um arquivo físico, por isso eu coloco ele em um byte[].
Mas quando imprimo o resultado só veio metade do arquivo que compactei originalmente.
Oque estou fazendo de errado nessa leitura?

Obs.: Se eu descompacto o arquivo usando winrar eu abro o xml e ele está completo lá, então tenho certeza que estou compactando o arquivo da maneira correta.

Repare que você lê apenas 1024 bytes do seu arquivo:

byte[] buffer = new byte[1024];
zis.read(buffer);

Você pode usar um ByteArrayInputStream para fazer a leitura completa:

ByteArrayInputStream bais = new ByteArrayInputStream();

byte[] buf = new byte[1024];

int n = zis.read(buf);
while(n > -1){
   bais.write(buf,0,n);
   n = zis.read(buf);
}

byte[] dadosCompletos = bais.toArray();
Leco2

Logo depois que postei eu voltei para o meu código e percebi isso também :slight_smile:
Mas obrigado pela resposta vou implementar aqui e vê se resolve.

Outra dúvida.

Antes estava criando um byte[] com o tamanho total a ser lido, e estava chamando:

byte[] buffer = new byte[tamanhoTotal];
zis.read(buffer);

E ainda assim ele lia só até uma parte.
Essa função read tem um limite máximo de bytes que ele lê?

rmendes08

O problema é que operações de I/O são operações complexas, por exemplo, em uma chamada de leitura do disco os bytes nunca são trazidos diretamente para a memória, tem toda uma operação para escalonar o cabeçote do disco, caches, consulta ao sistema de arquivos, etc. Sendo assim, não dá pra confiar que você vai conseguir ler todos os bytes de um arquivo a cada operação. No caso do Java, a única maneira de ter certeza que uma operação de I/O chegou ao fim é quando o método read() retorna o valor -1.

Leco2

Entendi! Obrigado pela resposta!

E o problema foi resolvido, agora estou conseguindo ler o arquivo inteiro. Estou lendo até receber o -1 :slight_smile:

Só uma correção no seu código que você deve ter digitado errado.

ByteArrayOutputStream baos = new ByteArrayOutputStream();

e não

ByteArrayInputStream bais = new ByteArrayInputStream();

:slight_smile:

Criado 27 de junho de 2014
Ultima resposta 27 de jun. de 2014
Respostas 4
Participantes 2