Compactação de Arquivos em Java

6 respostas
V

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
}

}
}

6 Respostas

T

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

}

V

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

V

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.
    */
S

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

V

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\”);

}
F

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

}

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

Criado 18 de maio de 2007
Ultima resposta 22 de ago. de 2008
Respostas 6
Participantes 4