terça-feira, 30 de agosto de 2016

Zipando todos arquivos de um diretório com Java

Fala galera.

O código abaixo mostra como zipar todos os arquivos de um determinado diretório.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * Created by William Suane on 8/30/2016.
 */
public class ZipandoTest {
    public static void main(String[] args) {
        /*Esse é o path em que será salvo o arquivo.zip, lembre-se como o path não começa com / estamos trabalhando com o
          *path relativo. Isso significa que dentro da pasta do meu projeto existe o diretório pasta/subpasta
          *ex: C:\MeuProjetoJava\pasta\subpasta
          *No final ficará C:\MeuProjetoJava\pasta\subpasta\arquivo.zip
          */
        Path dirZip = Paths.get("pasta/subpasta");
        /*Dentro deste diretório estão todos os arquivos que queremos zipar. Vamos zipar todos os arquivos que estiverem
        * no diretório C:\MeuProjetoJava\pasta\subpasta\subsubpasta 
        */
        Path dirFiles = Paths.get("pasta/subpasta/subsubpasta");
        /* O resolve vai juntar o primeiro path "pasta/subpasta" com o "arquivo.zip"
         * e utilizaremos a variável de referência zipFile para criar o arquivo.zip dentro do diretório pasta/subpasta.
         */
        Path zipFile = dirZip.resolve("arquivo.zip");
        // Ao ser executado esse try-with-resources vai criar o arquivo.zip imediatamente
        try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile.toFile()));
             // Como vamos zipar todos os arquivos do diretório dirFiles apenas iteramos sobre eles usando DirectoryStream
             DirectoryStream<Path> stream = Files.newDirectoryStream(dirFiles)) {
            for (Path path : stream) {
                //Adicionamos ao arquivo.zip uma entrada ZipEntry, que será o arquivo que será copiado para dentro do zip
                zip.putNextEntry(new ZipEntry(path.getFileName().toString()));
                // O código abaixo copiará os dados do arquivo para o arquivo dentro do zip
                BufferedInputStream bf = new BufferedInputStream(new FileInputStream(path.toFile()));
                byte[] buff = new byte[2048];
                int bytesRead;
                while ((bytesRead = bf.read(buff)) > 0) {
                    zip.write(buff, 0, bytesRead);
                }
                zip.flush();
                zip.closeEntry();
                bf.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Espero que tenham gostado. Em breve um vídeo sobre esse código em nosso canal no YouTube. Se quiser aprender mais sobre Java, se liga nesse cursão porreta de java ;D

Nenhum comentário:

Postar um comentário