Criar arquivo Zip on demmand!

1 resposta
Mikhas

Oi galera!

Criei um processo que gera um arquivo CSV e gostaria de compacta-lo em um ZIP.

Eu não achei exemplos de como criar o arquivo ZIP sem ter o arquivo que quero compactar gravado no disco.

Alguem ja fez isso ? Conta ai como …

1 Resposta

E

Basta você usar uma ZipOutputStream e gravar diretamente seus dados nessa ZipOutputStream. Faça o seguinte: modifique o exemplo abaixo, de modo que ele em vez de ler um arquivo do disco, já escreva diretamente na ZipOutputStream. Veja a linha “zos.write(buffer, 0, nBytes);” abaixo.

/**
 * 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>();
}
Criado 25 de agosto de 2010
Ultima resposta 25 de ago. de 2010
Respostas 1
Participantes 2