Como implementar um Zip

 

Autor: Ricardo Malnati Rosa Lima

 

Contato: limaricardo@gmail.com

Referência: http://java.sun.com/j2se/1.5.0/docs/api/index.html?java/util/zip/package-tree.html

 

Todas as classes utilizadas para criar esse artigo são nativas do Java; por tanto, não há necessidade de baixar nada além no JDK1.5.

 

O método zip antecede o addToZip para tratar exceções e para obrigar o close() do ZipOutputStream pelo finally.

 

 

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Zip {
 
  /**
   * Lê um arquivo passado no parâmetro para a memória.
   * @param file Arquivo a ser lido.
   * @return Arquivo lido em bytes.
   * @throws Exception
   */
  private byte[] read(File file) throws Exception {
    byte[] result = null;
    if (file != null && !file.isDirectory()) {
      final long length = file.length();
      result = new byte[(int) length];
      InputStream fi = new FileInputStream(file);
      byte b;
      long count = 0;
      while ((b = (byte) fi.read()) != -1) {
        result[(int) count++] = b;
      }
      fi.close();
    }
    return result;
  }
 
  /**
   * Adiciona um diretório ou arquivo a um ZipOutputStream instanciado.
   * @param zipName - Nome no arquivo zip que será gerado, exeplo: C:\\myzip.zip
   * @param file - Nome do diretório a ser comprimido.
   * @throws Exception
   */
  private void addToZip(ZipOutputStream out, File file, String path) throws Exception {
    byte data[] = null;
    ZipEntry entry = null;
    if (file != null) {
      String name = file.getAbsolutePath();
      name = name.substring(path.length() + 1, name.length()).replace(\\, /);
      System.out.println(">>>> Adding: " + name);
      if (file != null) {
        if (file.isDirectory()) {
          File[] files = file.listFiles();
          for (File f : files) {
            addToZip(out, f, path);
          }
        } else {
          entry = new ZipEntry(name);
          out.putNextEntry(entry);
          data = read(file);
          if (data != null && data.length > 0) {
            out.write(data, 0, data.length);
          }
          out.closeEntry();
          out.flush();
        }
      }
    }
  }
 
  /**
   * Comprime um diretório ou arquivo.
   * @param zipName - Nome no arquivo zip que será gerado, exemplo: C:\\myzip.zip
   * @param dirName - Nome do arquivo ou diretório a ser comprimido.
   */
  public void zip(String zipName, String dirName) {
    /* Instancia um ZipOutputStream e o passa por parametro, isso para poder
     * finalizar com um out.close(). */
    ZipOutputStream out = null;
    FileOutputStream dest = null;
    CheckedOutputStream checksum = null;
    try {
      dest = new FileOutputStream(new File(zipName));
      checksum = new CheckedOutputStream(dest, new Adler32());
      out = new ZipOutputStream(new BufferedOutputStream(checksum));
      File dir = new File(dirName);
      String parent = dir.getParent();
      int length = parent.length();
      String substring = parent.substring(0, length);
      addToZip(out, dir, substring);
      System.out.println(">>>> checksum: " + checksum.getChecksum().getValue());
    } catch (Exception e) {
      e.printStackTrace();
    } catch (Error err) {
      err.printStackTrace();
    } finally {
      try {
        out.flush();
        out.finish();
        out.close();
      } catch (IOException e) {
        e.printStackTrace();
      } catch (Error err) {
        err.printStackTrace();
      }
    }
  }
 
  public static void main(String[] args) {
    new Zip().zip("C:/tmp/Zip.zip", "C:/tmp/CRM");
  }
}

Código 1.n – Zip.java

 

 

Sobre o autor


Ricardo Malnati Rosa Lima é desenvolvedor Java desde 2002, reside em Brasília desde 2003 onde trabalha com aplicações Java para web. Atualmente colabora como líder de um projeto de CRM (Customer Relationship Management) para uma empresa de Call Center.

 

Artigo publicado em 24 de janeiro de 2007, Brasília-DF.