Zipando array

9 respostas
leandrogbraga

Pessoal fiz essa logica para compactar um array, so que ele não está funcionando, Tem como dar uma luz de onde estou errando?
Obrigado

String compac = "d:\backup\backup.zip";
                     byte[] buf = new byte[1024];

                         for (int j = arquivos.length ; i<j; i++){

                         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(compac));
                         FileInputStream in = new FileInputStream(arquivos[i]);

                        
                         out.putNextEntry(new ZipEntry(compac));

                         int len;
                         while((len = in.read(buf)) > 0){
                         out.write(buf, 0, len);
                         }

                         out.closeEntry();
                         in.close();
                         out.close();

                                    }

9 Respostas

E
for (int j = arquivos.length ; i<j; i++){

Quando vale i ao entrar nesse loop? É zero, ou algum outro valor?

leandrogbraga

Tu matou a pau… por um erro meu ele estava com valor 4.
Ele criou o zip mais ainda está com outro problema a minha lógica… ele não esta adicionando os arquivos do vetor no zip.

Obrigado

E
out.putNextEntry(new ZipEntry(compac));

Não faça isso - você não está passando absolutamente nenhuma informação sobre os nomes dos arquivos origem, e outras coisas necessárias.
Você usa o método de programação “se compilar, vai funcionar”? Que vergonha.
Pegue esse “new ZipEntry”, jogue em uma variável, sete as propriedades adequadas, senão ele não vai funcionar. Só depois disso é que você dá um “putNextEntry”.

leandrogbraga

Estou tentando entender como funciona… os exemplos que vi com zip eram bem simples e não explicavam muito bem… se eu não meter a mão e ver como funciona não rola, não tenho vergonha de perguntar o que eu não sei. Mais sei agradecer a quem me ajuda. Obrigado e irei usar a sua dica. :wink:

E

Você me deixou curioso. Enquanto está rodando aqui uma compilação monstruosa em C++ que está me impedindo de usar a máquina para outras coisas, vou tentar fazer um zipador de arquivos, só por curiosidade.

leandrogbraga

:lol: obrigado mais uma vez pela ajuda a este humilde técnico de suporte estudando java.

E

Veja como normalmente se faz para criar um .zip.

/**
 * Teste para zipar um arquivo.
 * Como rodar este programa:
 * a) Crie um subdiretório "teste" sob o seu diretório corrente
 * b) Copie um monte de arquivos .java e outros tipos para esse subdiretório
 * c) Rode o programa. Deve criar um arquivo "teste.zip"
 * d) Veja que ele criou um .zip com os arquivos .java apenas, não outros tipos.
 */
package guj;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 *
 */
public class ExemploZipador {

    public void setOutputFile(File outputFile) {
        this.outputFile = outputFile;
    }

    public void setInputFiles(Collection<File> inputFiles) {
        this.inputFiles.clear();
        this.inputFiles.addAll(inputFiles);
    }

    public List<File> listFiles(boolean recursive, File directory, Pattern pattern) {
        List<File> files = new ArrayList<File>();
        listFiles(recursive, files, directory, pattern);
        return files;
    }

    public void zip(List<Exception> exceptions) {
        ZipOutputStream zos = null;
        try {
            zos = new ZipOutputStream(new FileOutputStream(outputFile));
            byte[] buffer = new byte[10240];
            for (File f : inputFiles) {
                String entryName = f.getPath();
                ZipEntry ze = new ZipEntry(entryName);
                ze.setMethod(ZipEntry.DEFLATED);
                ze.setTime(f.lastModified());
                zos.putNextEntry(ze);
                BufferedInputStream bis = null;
                try {
                    bis = new BufferedInputStream(new FileInputStream(f));
                    System.out.printf ("Compresssing file %s...%n", entryName);
                    for (int nBytes = bis.read (buffer); nBytes > 0; nBytes = bis.read (buffer)) {
                        zos.write(buffer, 0, nBytes);
                    }
                } catch (IOException ex2) {
                    exceptions.add (ex2);
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException ex) {
                        }
                    }
                    zos.closeEntry();
                    System.out.printf ("File %s - Compressed = %,d, Original = %,d bytes%n", entryName, ze.getCompressedSize(), ze.getSize());
                }
            }
        } catch (IOException ex) {
            exceptions.add (ex);
        } finally {
            try {
                if (zos != null)
                    zos.close();
            } catch (IOException ex) {
            }
        }
    }

    private void listFiles(boolean recursive, List<File> files, File directory, final Pattern pattern) {
        File[] fileList = directory.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pattern.matcher(pathname.getName()).matches();
            }
        });
        for (File file : fileList) {
            if (file.isDirectory() && recursive) {
                listFiles(recursive, files, file, pattern);
            } else {
                files.add(file);
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        ExemploZipador ez = new ExemploZipador();
        ez.setOutputFile(new File("teste.zip"));
        ez.setInputFiles(ez.listFiles(true, new File("teste"), Pattern.compile(".*\.java", Pattern.CASE_INSENSITIVE)));
        List<Exception> exceptions = new ArrayList<Exception>();
        ez.zip(exceptions);
        if (exceptions.isEmpty()) {
            System.out.println("File was successfully created");
        } else {
            System.err.println(String.format("%d errors found while compressing files in directory %s", exceptions.size(), "teste"));
        }
    }

    private File outputFile;
    private List<File> inputFiles = new ArrayList<File>();
}
leandrogbraga

Muito Obrigado!!!

Amanhã eu estudarei linha a linha; hoje estou voando para a faculdade.

Obrigado

leandrogbraga

Consegui fazer funcionar... Vou postar o código para ajudar a quem possa vir a ter a mesma dificuldade que a minha.
Obrigado ao entanglement pelos posts.

obs: Não sou profissional, apenas um estudante, criticas são sempre bem vindas.

package zipnew;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.swing.JOptionPane;

public class Zipar {

    public static void zipa (Date d)throws IOException {

       String dir = ("d:\Cam");
       File file;
       File arquivos [];
       file = new File(dir);
       File afile [] = file.listFiles();
       arquivos = new File [afile.length];

       //Data do Sistema
       Calendar cal = Calendar.getInstance();
       cal.set (Calendar.HOUR,0);
       cal.set (Calendar.MINUTE,0);
       cal.set (Calendar.SECOND,0);
       cal.set (Calendar.MILLISECOND,0);
       Date sysDate = cal.getTime();
       sysDate.setHours(0);
       
       //Data do arquivo
        int i = 0;
        Date fileDate = null;
        fileDate= new Date(afile[i].lastModified());
        Calendar calFile = Calendar.getInstance();
        calFile.setTime(fileDate);
        calFile.set (Calendar.HOUR, 0);
        calFile.set (Calendar.MINUTE, 0);
        calFile.set (Calendar.SECOND, 0);
        calFile.set (Calendar.MILLISECOND, 0);
        fileDate = calFile.getTime();
        fileDate.setHours(0);

                //verifica se a data escolhida e a data corrente
                if(d.compareTo(sysDate)==0){
                 JOptionPane.showMessageDialog(null,"Não é possivel zipar arquivos do dia corrente!!!");
                   return;

                }else{

                //verifica se a data escolhida e um dia futuro
                if(d.after(sysDate)){
                 JOptionPane.showMessageDialog(null,"Escolha uma data valida!!!");
                 return;

                }else{
                    
                 for (int j = afile.length ; i<j; i++){
                 //verifica se existem arquivos na data escolhida e carrega o vetor
                     if(d.compareTo(fileDate)==0){
                     arquivos[i] = afile[i];

                     }
                }
                    //verifica se o vetor esta vazio
                    if (arquivos==null){
                        JOptionPane.showMessageDialog(null,"Não existe arquivo nesta data para compactar!!!");
                        return;

                 }else{

        byte[] buf = new byte[1024];

try {
  
    String outFilename = "d:\Backup\Backup.zip";
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));

    
        i = 0;
        for (int j=arquivos.length ; i<j; i++){

        FileInputStream in = new FileInputStream(arquivos[i]);
        out.putNextEntry(new ZipEntry(arquivos[i].getName()));
     
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

        out.closeEntry();
        in.close();
        }

        out.close();}
        catch (IOException e) {
        }

                   
     }
    }
   }
  }
 }
Criado 18 de agosto de 2010
Ultima resposta 19 de ago. de 2010
Respostas 9
Participantes 2