terça-feira, 20 de dezembro de 2016

Java: Descompactar um arquivo zip

Hoje vou mostrar como descompactar um arquivo Zip no Java. Vamos pegar o código abaixo:




01. public static void unzip(String file, String destiny) throws IOException{
02.    byte[] buffer = new byte[1024];
03.    File folder = new File(destiny);
        
04.    if(!folder.exists()){
05.      folder.mkdir();
06.    }

07.    try (ZipInputStream zis = new ZipInputStream(new FileInputStream(file))) {
08.      ZipEntry ze = zis.getNextEntry();
            
09.      while(ze!=null){
10.         String fileName = ze.getName();
11.         if(ze.isDirectory()){
12.            new File(destiny+fileName).mkdirs();
13.            System.out.println(destiny+fileName+" created.");
                    
14.          }else{
15.            File newFile = new File(destiny + File.separator + fileName);
16.            new File(newFile.getParent()).mkdirs();
17.            System.out.println(destiny+fileName+" is being unzipped.");
                    
18.            try (FileOutputStream fos = new FileOutputStream(newFile)) {
19.              int len;
20.              while ((len = zis.read(buffer)) > 0) {
21.                 fos.write(buffer, 0, len);
22.              }
}
23.              System.out.println(destiny+fileName+" is unzipped.");
24.          }
25.          ze = zis.getNextEntry();
26.       }
27.       System.out.println("All files are unzipped.");
28.       zis.closeEntry();
29.     }
30. }

Esta é um método que criei para descompactar um arquivo zip. Como parâmetro ele recebe o arquivo zip que vai ser descompactado (String file) e a pasta onde ele será descompactado (String destiny).
Na linha 02, nós vamos temos o buffer para onde os dados dos arquivos vão ser temporáriamente transportados e na linha 03, temos o arquivo que vai indicar a pasta de destino. Na linha 04, nós verificamos se a pasta de destino já existe e caso não exista, nós criamos ela.
Na linha 07 é onde começamos o processo de descompactação: criamos um FileInputStream com o caminho do arquivo zip como parâmetro para podermos lê-lo e um ZipInputStream para podermos decompactá-lo.
Na linha 08, nós vamos pegar o primeiro arquivo dentro do arquivo zip e a partir da linha 09, vamos fazer o processo em si. Primeiro verificamos se o registro é uma pasta ou um arquivo (linha 11). Se for uma pasta, nós simplesmente criamos ela. Caso seja um arquivo (linha 14), nós criaremos um objeto File para o arquivo que vai ser descompactado, criamos as pastas caso na qual ele será descompactado caso não exista e com um FileOutputStream, vamos escrever este arquivo. O laço da linha 20 vai lendo os arquivos pelo tamanho do buffer em bytes por vez, e uma vez que todos os bytes foram lidos, o loop se encerra. Ao terminar, pegamos o próximo arquivo (linha 25) e o processo se repete até não ter mais arquivos.
Então finalmentes, fechamos o arquivo zip (linha 28) e encerramos nosso processo.


Um comentário: