Dúvida em compactação: artigo zip

8 respostas
GJhames

Bom galera tenho uma dúvida pra desafiar voces:
Peguei o exemplo do arquivo zip neste site e fiz algumas modificações com o objetivo somente de zipar, listar, e descompactar, só que está dando um erro em tempo de execução.
Esta é a função para compactar, o erro está na função adicionaraoZip, o projeto completo (somente duas classes) vem em anexo.

private void comprimir() throws IOException {
		FileOutputStream fos;
		BufferedOutputStream bos;

		System.out.print("Digite o caminho da pasta onde tem o(s) arquivo(s) quer sera(ao) comprimido(s) "); //so sube fazer pra pegar pasta
		File arquivotemp = new File(sc.nextLine());  //como a funcao criarZip qer um array de files, vou fazer essa gambiarra aqui pra passar o array de string com os nomes do arquivo em um array de files
		File[] arquivos;
		if (arquivotemp.isDirectory()) {
			String[] temp = arquivotemp.list();
			System.out.println("tamanho: "+temp.length);
			arquivos = new File[temp.length];
			for (int i = 0; i &lt temp.length; i++) {
				arquivos[i] = new File(temp[i]);
			}			
		} else {
			arquivos = new File[1];
			arquivos[0] = arquivotemp;
		}
		System.out.print("Digite o nome do arquivo de output ");
		File arquivoZip = new File(sc.nextLine());
		
		fos = new FileOutputStream(arquivoZip);
		bos = new BufferedOutputStream(fos, 2048);
		//List listaEntradasZip = criarZip(bos, arquivos); //aqui vem nosso array de Files
		criarZip(bos, arquivos); //aqui vem nosso array de Files
	}
	private void criarZip (OutputStream os, File[] arquivos) throws ZipException, IOException {
		if (arquivos == null || arquivos.length &lt 1) {  //gostei dessa
			throw new ZipException ("O diretório está vazio!!");
		}
		List listaEntradasZip = new ArrayList();
		ZipOutputStream zos;                     //sempre vai ter que ter o imput e o output, as entradas são as entry que sao cada item do zip
		zos = new ZipOutputStream(os);           //isso era pra ficar dentro do try mas como n da certo vou logo botar aqui essa bosta
		try {
			for(int i = 0; i &lt arquivos.length; i++) {  //nesse for, para cada file do array, bota o caminho no método adicionaraozip
				String caminhoInicial = arquivos[i].getParent();   //nome do diretório (caminnho)
				System.out.println(arquivos[i]+"-&gt "+caminhoInicial);
				List novasEntradas = adicionarArquivoNoZip(zos, arquivos[i], caminhoInicial);
				if(novasEntradas != null) {
					listaEntradasZip.addAll (novasEntradas); //quando acabar adiciona todas as novas
				}
				
			}
		} finally {
			if(zos != null) {
				try {
					zos.close();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
			
		}
	}
	private List adicionarArquivoNoZip (ZipOutputStream zos, File arquivo, String caminhoInicial) throws IOException { //o output pra gravar, o arquivo pra colocar no output pra gravar, e o caminho do arquivo pra colocar no output pra gravar
		
		List listaEntradasZip = new ArrayList();
		FileInputStream fis;
		BufferedInputStream bis;
		//if (caminhoInicial == null)			caminhoInicial = ".\\";
		byte buffer[] = new byte[2048];
		try {
			//diretórios não são adicionados
			if( arquivo.isDirectory() ) {
				//recursivamente adiciona os arquivos dos diretórios abaixo
				File[] arquivos = arquivo.listFiles();
				for( int i=0; i<arquivos.length; i++ ) {
					List novasEntradas = adicionarArquivoNoZip( zos, arquivos[i], caminhoInicial );
					if( novasEntradas != null ) {
						listaEntradasZip.addAll( novasEntradas );
					}
				}
				return listaEntradasZip;
			}
			String caminhoEntradaZip = null;
			int idx = arquivo.getAbsolutePath().indexOf(caminhoInicial);
			if( idx >= 0 ) {
				//calcula os diretórios a partir do diretório inicial
				//isso serve para não colocar uma entrada com o caminho completo
				caminhoEntradaZip = arquivo.getAbsolutePath().substring( idx+caminhoInicial.length()+1 );
			}
			ZipEntry entrada = new ZipEntry( caminhoEntradaZip );
			zos.putNextEntry( entrada );
			zos.setMethod( ZipOutputStream.DEFLATED );
			fis = new FileInputStream( arquivo );
			bis = new BufferedInputStream( fis, 2048 );
			int bytesLidos = 0;
			while((bytesLidos = bis.read(buffer, 0, 2048)) != -1) {
				zos.write( buffer, 0, bytesLidos );
			}
			listaEntradasZip.add( entrada );
		}
		finally {
/*
			if( bis != null ) {
				try {
					bis.close();
				} catch( Exception e ) {}
			}
			if( fis != null ) {
				try {
					fis.close();
				} catch( Exception e ) {}
			}
			*/
		}
		return listaEntradasZip;
		
		
	}

8 Respostas

rodrigo_gomes

Olá, Seja bem vindo ao GUJ!

Qual o erro está dando?

[]´s

GJhames

Obrigado pelas boas vindas!!
O erro é em tempo de execução, acontece na função adicionarArquivoAoZip diz que as entradas estão vazias.
Bom,quando quer compactar um arquivo funciona perfeitamente, agora quando coloca uma pasta espera-se que se crie um array de Files dos arquivos dentro da pasta, mas da problema dizendo que as entradas estão vazas.

GJhames

ninguém?

rodrigo_gomes

Olá,

fiz uma pequena modificação nesse exemplo
http://www.exampledepot.com/egs/java.util.zip/CreateZip.html

e tá funfando beleza, inclusive com diretorios. Ficou um pouco feio, vc pode melhorar agora.

public void zipFile(File diretorio, ZipOutputStream out){
	File[] arquivos = diretorio.listFiles();
	// Create a buffer for reading the files
	byte[] buf = new byte[1024];
	try {
	      // Compress the files
	        for (File f : arquivos) {
          	     if(!f.isDirectory()){
	        		FileInputStream in = new FileInputStream(f);
	        		// Add ZIP entry to output stream.
	        		out.putNextEntry(new ZipEntry(f.getAbsoluteFile().getAbsolutePath()));
	        		// Transfer bytes from the file to the ZIP file
	        	        int len;
	        		while ((len = in.read(buf)) &gt 0) {
	        			out.write(buf, 0, len);
	        		}
	        		// Complete the entry
	        		out.closeEntry();
	        		in.close();
	        	}else{
	        		zipFile(f, out);
	        	}
	        }
	        // Complete the ZIP file
	        out.close();
	    } catch (IOException e) {
	    	e.printStackTrace();
	    }
}

para usar faça algo como:

String outFilename = "C:\\desenv\\outfile.zip";
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));
        zipFile(diretorio, out);

[]´s

GJhames

Valeu amigo mas, nossa… só isso já zipa? O código ficou bem mais enxuto!
Vou testar aqui e posto os resultados

GJhames

Me diz uma coisa, se a pasta a ser compactada estiver na mesma pasta do .class é necessário digitar o caminho completo?

rafaelbrizola

Pessoal, aproveitando o tópico… como eu faço para abrir um arquivo que está com senha… Por exemplo: quando o arquivo zip tiver senha, eu quero abrir uma janelinha onde o usuário pode digitar a senha…
Tem como??

rafaelbrizola

up??

Criado 17 de janeiro de 2007
Ultima resposta 19 de jan. de 2007
Respostas 8
Participantes 3