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 …
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 …
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>();
}