DEV Community

Discussion on: Zipar arquivos e pastas utilizando Java

Collapse
 
wldomiciano profile image
Wellington Domiciano

Olá! Achei bem legal o seu post. Com base nele pesquisei mais um pouco e vi que dá pra simplificar bastante usando recursos do Java 7 e do Java 8 como o try-with-resources e as streams.

Veja como eu fiz:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Main {
  static void zip(final String zipName, final String... filesToZip) {
    try (final ZipOutputStream outStream = new ZipOutputStream(Files.newOutputStream(Paths.get(zipName)))) {
      Arrays.stream(filesToZip).forEach(fileName -> {
        try (final Stream<Path> paths = Files.walk(Paths.get(fileName))) {
          paths.filter(Files::isRegularFile).forEach(path -> {
            try {
              outStream.putNextEntry(new ZipEntry(path.toString()));
              outStream.write(Files.readAllBytes(path));
              outStream.closeEntry();
            } catch (final IOException e) {
              e.printStackTrace();
            }
          });
        } catch (final IOException e) {
          e.printStackTrace();
        }
      });
    } catch (final IOException e) {
      e.printStackTrace();
    }
  }

  public static void main(String... args) throws Exception {
    zip("only-one-file.zip", "simple-file.txt");
    zip("a-directory.zip", "simple-directory");
    zip("mixed.zip", "simple-file.txt", "simple-directory");
  }
}
Enter fullscreen mode Exit fullscreen mode

Eu não testei exaustivamente, então, se vc testar e puder dizer se funcionou (ou se deu problema) para o seu caso de uso eu ficaria bem feliz.

Uma coisa interessante que vi foi que vc não precisa fechar o seu FileOutputStream porque ele é fechado automaticamente quando vc fecha o ZipOutputStream. Até fiz este código para testar:

class Testando extends FileOutputStream {
  Testando() throws FileNotFoundException {
    super("simple-file.txt");
  }

  @Override
  public void close() throws IOException {
    System.out.println("FECHOU!!!");
    super.close();
  }

  public static void main(String... args) throws Exception {
    final ZipOutputStream outStream = new ZipOutputStream(new Testando());
    outStream.close();
  }
}
Enter fullscreen mode Exit fullscreen mode

Obrigado por compartilhar.