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