Metodo para descompactação ZIP gerando PNG com erro

2 respostas
Morpheus_Urubu

Estou com um problema em um método, que aparentemente funciona 100%: le o arquivo ZIP, descompacta todos os arquivos no lugar certo, mantendo a hierarquia dos subdiretorios e arquivos, porem, os arquivos PNG descompactados, saem corrompídos ou algo do tipo. Eu tentei abrir manualmente os arquivos depois da descompactacao, e recebo uma mensagem

Erro fatal ao ler o arquivo de imagem PNG: [00][00][00][00]: invalid chunk type

Dentro do arquivo zip, antes da descompactação, eu consigo visualizar a imagem numa boa

Alguem saberia me dar uma mao ?

Segue o codigo do metodo:

public void descompacta(String path) throws FileNotFoundException, IOException {
        final int BUFFER = 4096;
        FileInputStream fis = new FileInputStream(path);
        File zip = new File(path);
        BufferedInputStream bis = new BufferedInputStream(fis, BUFFER);
        ZipInputStream zis = new ZipInputStream(bis);
        ZipEntry entrada = null;
        String dir = zip.getCanonicalPath();

        dir = dir.substring(0, dir.indexOf("."));

        try {
            if (!zip.isDirectory()) {
                zip = new File(dir);
                zip.mkdirs();
            }

            while ((entrada = zis.getNextEntry()) != null) {
                int bytesLidos = 0;
                byte[] dados = new byte[BUFFER];

                StringBuffer strBuffer = new StringBuffer();
                
                strBuffer.append(dir);
                strBuffer.append(File.separatorChar);
                strBuffer.append(entrada.getName());
                String destino = String.valueOf(strBuffer);

                File zipFile = new File(destino);
                if (entrada.isDirectory()) {
                    zipFile.mkdirs();
                    continue;
                }

                if (!zipFile.getParentFile().exists()) {
                    zipFile.getParentFile().mkdirs();
                }

                FileOutputStream fos = new FileOutputStream(zipFile.getCanonicalPath());

                BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);
                while ((bytesLidos = zis.read(dados, 0, BUFFER)) != -1) {
                    dest.write(dados, 0, BUFFER);
                }
                dest.flush();
                dest.close();
                fos.close();
            }
            zis.close();
            bis.close();
            fis.close();
        } catch (IOException iOException) {
            System.out.printf("erro", iOException );
        }
    }

2 Respostas

T

Os arquivos estão ficando com o comprimento maior que o original, não?
Troque

while ((bytesLidos = zis.read(dados, 0, BUFFER)) != -1) {  
                    dest.write(dados, 0, bytesLidos );  
                }

por

while ((bytesLidos = zis.read(dados, 0, dados.length)) != -1) {  
                    dest.write(dados, 0, bytesLidos);  
                }
Morpheus_Urubu

Cara muito obrigado !!! NA MOSCA !!!

Vou rever agora o algoritmo bem como os metodos write e read acima mencionados, pra ver o que me levou a escrever esse erro.

Valeu

Criado 1 de julho de 2009
Ultima resposta 1 de jul. de 2009
Respostas 2
Participantes 2