[RESOLVIDO] preciso compactar um arquivo via código

Tudo bom pessoal?

Então, o problema é o seguinte:
Preciso compactar(zip) no arquivo “athus_bkp.sql” depois que foi criado.
Este arquivo é um bkp do banco, e precisaria compacta-lo para naum ficar tão grande!

O código é este:

public class BackupDB {
	
	public void realizarBackup() throws Exception{
		Runtime r = Runtime.getRuntime();
		
		try{		
			String diretorioPg = DiretorioPostgresUtil.getDiretorioPgDump();
			String fileBackup = CaminhoUtils.CAMINHO_PASTA_ATHUS + "backup"
				+ File.separatorChar + "athus_bkp.sql";
			
			File file = new File(fileBackup);
			if(!file.getParentFile().exists())
				file.getParentFile().mkdirs();
				
			diretorioPg = diretorioPg.concat(" -U postgres --file=\""+fileBackup+"\" athus");
			System.out.println(diretorioPg);
			Process p = r.exec(diretorioPg);
			
			int i = p.waitFor();
			
			if(i > 0){
				InputStreamReader streamReader = new InputStreamReader(p.getErrorStream());
				BufferedReader reader = new BufferedReader(streamReader);
				String linha;
				while((linha = reader.readLine()) != null){
					System.err.println(linha);
				}
			}
			System.out.println("Backup realizado com sucesso!");
		}catch(IOException ex){
			System.out.println("Erro ao tentar realizar o backup!"+ex.getMessage());
		}
	}
	
	public static void main(String[] args) throws Exception{
		BackupDB b = new BackupDB();
		b.realizarBackup();
	}
}

Obrigado, desde já, pela ajuda!

http://www.guj.com.br/article.show.logic?id=181

Tentei estes mas não deu certo!

Bom dia.

Seria gerar um arquivo ZIP ou compactar um array de bytes?
Pelo o que pude entender, é gerar um arquivo ZIP, para tal, é bem simples.

Basta usar as classes ZipEntry e ZipOutputStream.
Exemplo aqui.

É bem simples.

Abraços.

Se voce quiser realmente compactar voce vai precisar estudar algum algoritmo de compactação.

Talvez isto aqui sirva.

Inté.

nenhum da certo! extranho…
Preciso compactar o arquivo “athus_bkp.sql”

String fileBackup = CaminhoUtils.CAMINHO_PASTA_ATHUS + "backup"  
                + File.separatorChar + "athus_bkp.sql";

Ele foi gerado e salvo neste local.
Preciso pegar dali o arquivo “athus_bkp.sql” e compacta-lo e salvalo neste mesmo local!

Se não funciona é porque fez algo errado, meio óbvio?
Talvez não.

Poste o seu código para analisarmos :slight_smile:
Abraços.

Esta ai é parte do compactar, o resto está acima!

public void compactar (String arqSaida) {   
	      int cont;   
	      byte[] dados = new byte[TAMANHO_BUFFER];   
	      String arquivo = CaminhoUtils.CAMINHO_PASTA_ATHUS + "backup"
			+ File.separatorChar + "athus_bkp.sql";;     
	      BufferedInputStream origem = null;   
	      FileInputStream streamDeEntrada = null;   
	      FileOutputStream destino = null;   
	      ZipOutputStream saida = null;   
	      ZipEntry entry = null;  
	        
	      try {   
	         destino = new FileOutputStream(arqSaida);   
	         saida = new ZipOutputStream(new BufferedOutputStream(destino));  
	         File f = new File("."); // Todos os arquivos da pasta onde a classe está     
	              
	            File arq = new File(arquivo);   
	   
	            if (arq.isFile() && !(arq.getName()).equals(arqSaida)) {   
	               System.out.println("Compactando: " + arquivo);   
	   
	               streamDeEntrada = new FileInputStream(arq);   
	               origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);   
	               entry = new ZipEntry(arquivo);   
	               saida.putNextEntry(entry);  
	                 
	               while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {   
	                  saida.write(dados, 0, cont);   
	               }   
	               origem.close();   
	            }   
	            
	         saida.close();    
	      } catch(Exception e) {   
	         e.printStackTrace();
	         System.out.println("Erro no compactar: "+e.getMessage());
	      } 
	      System.out.println(arqSaida);
	      System.out.println("Compactado com sucesso!");
	   }

Antes de mais nada, está gerando exceção?
Se sim, poste o stacktrace.

Outro detalhe, ele está caindo dentro deste if?

if (arq.isFile() && !(arq.getName()).equals(arqSaida)) {
//seu código
}

Não esqueça de executar close nas classes, tem classe que não está executando o método close e isto pode estar sendo a causa da não-compactação do arquivo.

Abraços.

[quote=LipeJava]Esta ai é parte do compactar, o resto está acima!

[code]
public void compactar (String arqSaida) {
int cont;
byte[] dados = new byte[TAMANHO_BUFFER];
String arquivo = CaminhoUtils.CAMINHO_PASTA_ATHUS + “backup”
+ File.separatorChar + “athus_bkp.sql”;;
BufferedInputStream origem = null;
FileInputStream streamDeEntrada = null;
FileOutputStream destino = null;
ZipOutputStream saida = null;
ZipEntry entry = null;

      try {   
         destino = new FileOutputStream(arqSaida);   
         saida = new ZipOutputStream(new BufferedOutputStream(destino));  
         File f = new File("."); // Todos os arquivos da pasta onde a classe está     
              
            File arq = new File(arquivo);   
   
            if (arq.isFile() && !(arq.getName()).equals(arqSaida)) {   
               System.out.println("Compactando: " + arquivo);   
   
               streamDeEntrada = new FileInputStream(arq);   
               origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);   
               entry = new ZipEntry(arquivo);   
               saida.putNextEntry(entry);  
                 
               while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {   
                  saida.write(dados, 0, cont);   
               }   
               origem.close();   
            }   
            
         saida.close();    
      } catch(Exception e) {   
         e.printStackTrace();
         System.out.println("Erro no compactar: "+e.getMessage());
      } 
      System.out.println(arqSaida);
      System.out.println("Compactado com sucesso!");
   }

[/code][/quote]

Só olhando por cima, para mim parece que tá faltando chamar o método “closeEntry()” da classe ZipOutputStream no meio do percurso.

EDITADO: Ops, posso ter escrito algo irrelevante no caso de se usar arquivos zip com apenas um arquivo dentro. Ainda assim sugiro usar alguma solução como a que fiz ou a do usuário entanglement.

Inté.

Na realidade, o caminho de saída ou de entrada podem estar incorretos.
Eu simplesmente copiei e colei o seu método aqui, executei os testes e ocorreu tudo bem, gerou o arquivo ZIP sem problemas.

De qualquer forma, execute os close, por garantia, já que eles podem estar atrelados a outro(s) processo(s).
E esta linha:

File f = new File("."); // Todos os arquivos da pasta onde a classe está 

Não faz absolutamente nada :slight_smile:

Abraços champ.

Bem, agora consegui fazer ele anexar!
Muito obrigado mesmo, mas tem um detalhe.
Ele me anexo todo o caminho (C://Arquivos de Programas/…/athus_bkp.sql)
Ai tenq ir abrindo as pastas até chegar no arquivo que quero. Mas está compactado!

Obrigado!