Compactação de Arquivos em Java

Pessoal preciso fazer um programinha para compactar varios arquivos de uma extensão .txt que contem em um diretorio e compactar todos… Fiz um procedimento mas esse eu consigo compactar apenas 1 arquivo, eu preciso compactar varios… ALGUEM PODE ME AJUDAR…

public class Estudos{
public static void main(String args[]) {

// nome do arquivo que será compactado
String arquivo = "testes.txt";
System.out.println("arquivo esta recebendo testes.txt");

//String arquivos[];
// Cria um buffer para ler os dados do arquivo
byte[] buf = new byte[1024];

try{
  // Cria o arquivo zip
  String compac = "testes.zip";
  ZipOutputStream out = new ZipOutputStream(new FileOutputStream(compac));
  System.out.println("criando o arquivo");
  // Comprime o arquivo
  FileInputStream in = new FileInputStream(arquivo);
  System.out.println("adicionando o arquivo");
  // Adiciona o arquivo ao fluxo de saída
  out.putNextEntry(new ZipEntry(arquivo));

  // transfere dados do arquivo para o arquivo zip
  int len;
  while((len = in.read(buf)) > 0){
    out.write(buf, 0, len);
  }

  // Finaliza a entrada
  out.closeEntry();
  in.close();

  // Completa o arquivo zip
  out.close();
}
catch(IOException e){
  // possíveis erros aqui
} 

}
}

package zip;

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 {

private Zip() {
}

private static 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;
}

/**
 * @param out - Arquivo destino
 * @param file - Arquivo ou Diretório a ser zipado
 * @param path - Caminho do arquivo de destino
 * @throws Exception
 */
private static boolean addToZip(ZipOutputStream out, File file, String path) throws Exception {
	byte data[] = null;
	ZipEntry entry = null;

	if (file != null) {
		if (file.exists()) {			  			  			  
			if (file != null) {
				if (file.isDirectory()) {
					File[] files = file.listFiles();

					for (int cont = 0; cont < files.length; cont++) {
						addToZip(out, files[cont], path);
					}
				}
				else {						
					String name = file.getName();					
					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();
				}
			}

			return true;
		}
	}

	return false;
}

/**
 * Comprime um diretório ou arquivo.
 * @param zipName - Nome no arquivo zip que será criado.
 * @param dirName - Nome do arquivo ou diretório a ser comprimido.
 */
public static boolean zip(String zipName, String dirName) {
	ZipOutputStream out = null;
	FileOutputStream dest = null;
	CheckedOutputStream checksum = null;
	boolean zipado = false;
	
	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);
		zipado = addToZip(out, dir, substring);
	}
	catch (Exception e) {
		e.printStackTrace();
	}
	catch (Error err) {
		err.printStackTrace();
	}
	finally {
		try {
			if (zipado) {
				out.flush();
				out.finish();
				out.close();	       
			}
			else {
				out = null; 		
			}
		}
		catch (IOException e) {
			zipado = false;
			e.printStackTrace();
		}
		catch (Error err) {
			zipado = false;
			err.printStackTrace();
		}

		System.gc();
	}

	return zipado;
}

}

Amigo, vc me passou acima como faz, mas eu nao entendi como em que momento eu vou passar o nome do diretorio ‘diretorio LOG’ e a extensao que ele deve pegar…‘extensao ‘.xlg’’, eu nao entendi em que momento isso ira acontecer… sou iniciante em java tem como vc ve dar essa forcinha… obrigado

NAO ENTENDI COMO USA ISSO TEM COMO ME EXPLICAR DANDO EXEMPLOS. meu diretorio é c:\log e a extensao .xlg

/**

  • @param out - Arquivo destino
  • @param file - Arquivo ou Diretório a ser zipado
  • @param path - Caminho do arquivo de destino
  • @throws Exception
    */

/**

  • Comprime um diretório ou arquivo.
  • @param zipName - Nome no arquivo zip que será criado.
  • @param dirName - Nome do arquivo ou diretório a ser comprimido.
    */

Vanessa essas tags não são codigo do JAVA, são tags JAVADOC usadas apenas para poder gerar um documentação da sua classe, parecida com a que a sun disponibiliza no site.

Eu não analise o codigo par ver se ta certo, mas assumindo que ele está correto:

quando você chamar o metodo

 public static boolean zip(String zipName, String dirName)

Você passa o nome do arquivo zip a ser gerado (zipName) e o nome do diretoria a ser zipado (dirName).

da uma olhadinha aqui
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html

consegui fazer funcionar mais apenas compactando um arquivo quero saber como faz para compactar todos que estao no diretorio

public static void main(String[] args)
{
new Zipar().zip(“C:\log\testes.zip”, “C:\compactados\”);
}

[quote=Toko]package zip;

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 {

private Zip() {
}

private static 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;
}

/**
 * @param out - Arquivo destino
 * @param file - Arquivo ou Diretório a ser zipado
 * @param path - Caminho do arquivo de destino
 * @throws Exception
 */
private static boolean addToZip(ZipOutputStream out, File file, String path) throws Exception {
	byte data[] = null;
	ZipEntry entry = null;

	if (file != null) {
		if (file.exists()) {			  			  			  
			if (file != null) {
				if (file.isDirectory()) {
					File[] files = file.listFiles();

					for (int cont = 0; cont < files.length; cont++) {
						addToZip(out, files[cont], path);
					}
				}
				else {						
					String name = file.getName();					
					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();
				}
			}

			return true;
		}
	}

	return false;
}

/**
 * Comprime um diretório ou arquivo.
 * @param zipName - Nome no arquivo zip que será criado.
 * @param dirName - Nome do arquivo ou diretório a ser comprimido.
 */
public static boolean zip(String zipName, String dirName) {
	ZipOutputStream out = null;
	FileOutputStream dest = null;
	CheckedOutputStream checksum = null;
	boolean zipado = false;
	
	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);
		zipado = addToZip(out, dir, substring);
	}
	catch (Exception e) {
		e.printStackTrace();
	}
	catch (Error err) {
		err.printStackTrace();
	}
	finally {
		try {
			if (zipado) {
				out.flush();
				out.finish();
				out.close();	       
			}
			else {
				out = null; 		
			}
		}
		catch (IOException e) {
			zipado = false;
			e.printStackTrace();
		}
		catch (Error err) {
			zipado = false;
			err.printStackTrace();
		}

		System.gc();
	}

	return zipado;
}

}[/quote]

Esse código nao está funcionando com arquivos do tipo pdf.
Ele está corrompendo os pdfs.