Compactação de diversos diretorio [Resolvido]

Boa noite,

Estou preparando uma classe para compactar arquivos:

/**
 *
 * @author Kaos
 */
public class Compactador {
    private final int BUFFER = 1024;
    private String nomeDoArquivo;
    private String destino;
    private BufferedInputStream bufferedInputStream;
    private FileInputStream fileInputStream;
    private FileOutputStream fileOutputStream;
    private ZipOutputStream zipOutputStream;
    private BufferedOutputStream bufferedOutputStream;
    private byte[] buffer;
    private File file;
    private File[] files;

    public Compactador(
            String informeArquivo,
            String informeDestino
            ) {
        this.nomeDoArquivo  = informeArquivo;
        this.destino = informeDestino;
        this.fileInputStream = null;
        this.bufferedInputStream = null;
        this.fileOutputStream = null;
        this.zipOutputStream = null;
        this.bufferedInputStream = null;
        this.buffer = new byte[this.BUFFER];
        this.file = null;
        this.files = null;
    }

    /**
     * Compacta o arquivo ou diretorio.
     * @throws FileNotFoundException 
     * @throws IOException
     */
    public void compactaArquivo() throws FileNotFoundException, IOException {
        // Cria o stream, para, receber os arquivos.
        this.fileOutputStream = new FileOutputStream(this.destino);

        // Direciona a saida do stream do ZipOutput, para o arquivo.
        // Através da referencia.
        this.zipOutputStream = new ZipOutputStream(this.fileOutputStream);

        // Cria referencia ao arquivo que será compactado.
        this.file = new File(this.nomeDoArquivo);

        // Inicio do laço ara compactação do arquivo ou diretorio.
        if(this.file.isDirectory()) {
            // Recebe os itens, de arquivos e direotorios, do diretorio.
            this.files = this.file.listFiles();

            // Verifica se cada item é ou não um diretorio.
            // E prepara o buffer de saida.
            for(int i = 0; i < this.files.length; i++) {
                if(this.files[i].isDirectory()) {
                    File[] arquivoLocal = this.files[i].listFiles();
                    // E se houver muitos subdiretorios? Ex: 1... 1000 niveis.
                }
            }
        } else {
            // Caso seja um arquivo já executa o processo de inserção.
            this.setArquivo(this.file);
            // Fecha a entrada recem executada.
            this.zipOutputStream.closeEntry();
        }

        // Finaliza o buffer de entrada.
        this.bufferedInputStream.close();
        // Finaliza a saida, usada, para criar o arquivo compactado.
        this.zipOutputStream.close();
    }

    private void setArquivo(File informeFile) throws FileNotFoundException,
            IOException {
        // Carrega a referencia através no nome do arquivo.
        this.fileInputStream = new FileInputStream(informeFile.getName());

        // Prepara buffer para manipulação.
        this.bufferedInputStream = new BufferedInputStream(
                this.fileInputStream,
                this.BUFFER);

        // Constroi um novo ZipEntry para ser inserido no ZipOutputStream.
        ZipEntry entrada = new ZipEntry(informeFile.getName());

        // Adiciona entrada do ZipEntry, no stream de saida.
        this.zipOutputStream.putNextEntry(entrada);

        // Armazena retorno do buffer, para, servir de paramentro.
        int contador;

        // Enquanto contador for diferente de -1 executa a tarefa.
        while((contador = this.bufferedInputStream.read(this.buffer, 0,
              this.BUFFER)) != -1) {
            // Escreve arquivo em disco.
            this.bufferedOutputStream.write(this.buffer, 0, contador);
            }
    }

}

Na linha 58, a finalidade, é tratar os diretorios de forma distinta, ou seja inserir todos os arquivos contidos. Porém no caso de diretorios com muitos niveis, aquela forma de trabalho, seria muito trabalhosa e pouco eficiente.

Há alguma forma de enviar um diretorio inteiro, para ser compactado, sem que seja necessário citar item a item?

[]s

Isso cheira a método recursivo. Afinal, o que impede de um desses files também ser um diretório?

Boa noite,

O código abaixo, tirei do site da Oracle: http://java.sun.com/developer/technicalArticles/Programming/compression/

import java.io.*;
import java.util.zip.*;

public class Zip {
   static final int BUFFER = 2048;
   public static void main (String argv[]) {
      try {
         BufferedInputStream origin = null;
         FileOutputStream dest = new 
           FileOutputStream("myzip.zip");
         ZipOutputStream out = new ZipOutputStream(new 
           BufferedOutputStream(dest));
         //out.setMethod(ZipOutputStream.DEFLATED);
         byte data[] = new byte[BUFFER];
         // get a list of files from current directory
         File f = new File(".");
         String files[] = f.list();

         for (int i=0; i<files.length; i++) {
            System.out.println("Adding: "+files[i]);
            FileInputStream fi = new 
              FileInputStream(files[i]);
            origin = new 
              BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(files[i]);
            out.putNextEntry(entry);
            int count;
            while((count = origin.read(data, 0, 
              BUFFER)) != -1) {
               out.write(data, 0, count);
            }
            origin.close();
         }
         out.close();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

Estudei esse código e o apresentado nos artigos do forum, em particular o código acima, já deu problema para compactar diretorio, no teste que fiz aqui. Entendi, apartir desse comportamento que não seria possivel compactar um diretorio diretamente.

Edit: Na verdade, há possibilidade de haver diversos niveis de diretorios, agora pra implementar ta meio complicado.

[]s

Boa noite,

Encontrei um artigo direfere, nem tentei recursividade no código que postei no inicio, em vitude de um erro de permissão que estava aparecendo mesmo com arquivos. Abaixo segue o link que encontrei, que possui um exemplo bem interessante:

http://www.artigonal.com/programacao-artigos/zipunzip-em-java-1513586.html

[]s