1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Descompactar arquivos ZIP com java.util.zip.ZipFile não funciona no Linux.

Estou com um código em Java para descompactar um arquivo .ZIP que funciona perfeitamente no Windows. Porem quando executo no Linux o arquivo não é descompactado. Segue abaixo o código:

public void salvar() {
        File file = new File(caminho.getFileName());
        File diretorio = new File(file.getAbsolutePath());
        File[] arquivos = diretorio.listFiles();
        File zip = new File(file.getPath().substring(file.getName().lastIndexOf("\\") + 1));

try { 

File diretorio1 = new File(File.separator + "arquivos" + File.separator + "2013" + File.separator + "emitidas" + File.separator + "ernani");
extrairZip(zip,diretorio1);

 } catch (Exception e) {     
            error(e.toString());     
       }
}


// Código para Descompactar

public void extrairZip(File arquivoZip, File diretorio ) throws ZipException, IOException {   
        ZipFile zip = null;   
        File arquivo = null;   
        InputStream is = null;   
        OutputStream os = null;   
        byte[] buffer = new byte[2048];   
        try {   
          //cria diretório informado, caso não exista   
          if( !diretorio.exists() ) {   
            diretorio.mkdirs();   
          }   
          if( !diretorio.exists() || !diretorio.isDirectory() ) {   
            throw new IOException("Informe um diretório válido");   
          }   
          zip = new ZipFile( arquivoZip );   
          Enumeration e = zip.entries();   
          while( e.hasMoreElements() ) {   
            ZipEntry entrada = (ZipEntry) e.nextElement();   
            arquivo = new File( diretorio, entrada.getName() );   
            //se for diretório inexistente, cria a estrutura    
            //e pula pra próxima entrada   
            if( entrada.isDirectory() && !arquivo.exists() ) {   
              arquivo.mkdirs();   
              continue;   
            }   
            //se a estrutura de diretórios não existe, cria   
            if( !arquivo.getParentFile().exists() ) {   
              arquivo.getParentFile().mkdirs();   
            }   
            try {   
              //lê o arquivo do zip e grava em disco   
              is = zip.getInputStream( entrada );   
              os = new FileOutputStream( arquivo );   
              int bytesLidos = 0;   
              if( is == null ) {   
                throw new ZipException("Erro ao ler a entrada do zip: "+entrada.getName());   
              }   
              while( (bytesLidos = is.read( buffer )) > 0 ) {   
                os.write( buffer, 0, bytesLidos );   
              }   
            } finally {   
              if( is != null ) {   
                try {   
                  is.close();   
                } catch( Exception ex ) {}   
              }   
              if( os != null ) {   
                try {   
                  os.close();   
                } catch( Exception ex ) {}   
              }   
            }   
          }   
        } finally {   
          if( zip != null ) {   
            try {   
              zip.close();   
            } catch( Exception e ) {}   
          }   
        }   
      }

Este código não funciona no Linux e não gera nenhum erro no log do tomcat.

O diretório existe e o dono é o usuário que iniciar o tomcat. Inclusive eu faço um upload do arquivo .zip para este diretório sem problemas e quando acesso o linux e executo unzip nome_do_arquivo.zip o arquivo é descompactado sem problemas. Já tentei "/arquivos/2013/emitidas/ernani", "//arquivos//2013//emitidas//ernani", "/arquivos/2013/emitidas/ernani/","//arquivos//2013//emitidas//ernani//" e nada.

  • Você já tentou debugar esse código no Linux? Caso já tenha tentado, em qual linha o programa "se perde"?

    Felipe   13 de mai de 2013
  • File diretorio1 = new File(File.separator + "arquivos" + File.separator + "2013" + File.separator + "emitidas" + File.separator + "ernani"); extrairZip(zip,diretorio1); - isso é "/arquivos/2013/emitidas/ernani" - esse diretório já está criado no Linux e você tem as permissões corretas?

    entanglement   14 de mai de 2013
  • Os erros não estão aparecendo porque você está dando try catch mas não está tratando as exceções, então elas estão sendo "engolidas" remova os try catch e deixe acontecer, exception e edite sua pergunta adicionando a stacktrace

    Chico Sokol   14 de mai de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags compressão java ou faça a sua própria pergunta.