Compactação de diversos diretorio [Resolvido]

3 respostas
KaosBr

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

3 Respostas

ViniGodoy

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

KaosBr

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

KaosBr

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

Criado 20 de dezembro de 2010
Ultima resposta 22 de dez. de 2010
Respostas 3
Participantes 2