Hoje vamos dar uma olhada no exemplo de arquivo zip em Java. Também vamos comprimir uma pasta e criar um arquivo zip usando um programa Java.
Java ZIP
O java.util.zip.ZipOutputStream
pode ser usado para comprimir um arquivo no formato ZIP. Como um arquivo zip pode conter várias entradas, o ZipOutputStream usa java.util.zip.ZipEntry
para representar uma entrada de arquivo zip.
Arquivo ZIP em Java
Criar um arquivo zip para um único arquivo é muito fácil. Precisamos criar um objeto ZipOutputStream a partir do objeto FileOutputStream do arquivo de destino. Em seguida, adicionamos uma nova ZipEntry ao ZipOutputStream e usamos o FileInputStream para ler o arquivo de origem para o objeto ZipOutputStream. Depois de terminarmos de escrever, precisamos fechar a ZipEntry e liberar todos os recursos.
Pasta Zip em Java
Zippingar um diretório é um pouco complicado, primeiro precisamos obter a lista de arquivos como caminho absoluto. Em seguida, processar cada um separadamente. Precisamos adicionar um ZipEntry para cada arquivo e usar FileInputStream para ler o conteúdo do arquivo de origem para o ZipEntry correspondente a esse arquivo.
Exemplo de Zip em Java
Aqui está o programa Java mostrando como compactar um único arquivo ou compactar uma pasta em Java.
package com.journaldev.files;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFiles {
List filesListInDir = new ArrayList();
public static void main(String[] args) {
File file = new File("/Users/pankaj/sitemap.xml");
String zipFileName = "/Users/pankaj/sitemap.zip";
File dir = new File("/Users/pankaj/tmp");
String zipDirName = "/Users/pankaj/tmp.zip";
zipSingleFile(file, zipFileName);
ZipFiles zipFiles = new ZipFiles();
zipFiles.zipDirectory(dir, zipDirName);
}
/**
* This method zips the directory
* @param dir
* @param zipDirName
*/
private void zipDirectory(File dir, String zipDirName) {
try {
populateFilesList(dir);
// agora compacta os arquivos um por um
// cria ZipOutputStream para escrever no arquivo zip
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
// para ZipEntry, precisamos manter apenas o caminho relativo do arquivo, então usamos substring no caminho absoluto
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
// lê o arquivo e escreve no ZipOutputStream
FileInputStream fis = new FileInputStream(filePath);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
fis.close();
}
zos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* This method populates all the files in a directory to a List
* @param dir
* @throws IOException
*/
private void populateFilesList(File dir) throws IOException {
File[] files = dir.listFiles();
for(File file : files){
if(file.isFile()) filesListInDir.add(file.getAbsolutePath());
else populateFilesList(file);
}
}
/**
* This method compresses the single file to zip format
* @param file
* @param zipFileName
*/
private static void zipSingleFile(File file, String zipFileName) {
try {
// cria ZipOutputStream para escrever no arquivo zip
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
// adiciona um novo Zip Entry ao ZipOutputStream
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
// lê o arquivo e escreve no ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
// fecha o ZipEntry para escrever no arquivo zip
zos.closeEntry();
// fecha os recursos
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
A saída do programa de exemplo de compactação Java acima é:
/Users/pankaj/sitemap.xml is zipped to /Users/pankaj/sitemap.zip
Zipping /Users/pankaj/tmp/.DS_Store
Zipping /Users/pankaj/tmp/data/data.dat
Zipping /Users/pankaj/tmp/data/data.xml
Zipping /Users/pankaj/tmp/data/xmls/project.xml
Zipping /Users/pankaj/tmp/data/xmls/web.xml
Zipping /Users/pankaj/tmp/data.Xml
Zipping /Users/pankaj/tmp/DB.xml
Zipping /Users/pankaj/tmp/item.XML
Zipping /Users/pankaj/tmp/item.xsd
Zipping /Users/pankaj/tmp/ms/data.txt
Zipping /Users/pankaj/tmp/ms/project.doc
Observe que ao registrar os arquivos no zip no diretório, estou imprimindo o caminho absoluto. Mas ao adicionar a entrada zip, estou usando o caminho relativo ao diretório para que, ao descompactá-lo, ele crie a mesma estrutura de diretório. Isso é tudo para o exemplo de compactação em Java.
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example