Hoy echaremos un vistazo al ejemplo de archivo zip en Java. También comprimiremos una carpeta y crearemos un archivo zip usando un programa en Java.
Java ZIP
java.util.zip.ZipOutputStream
se puede utilizar para comprimir un archivo en formato ZIP. Dado que un archivo zip puede contener múltiples entradas, ZipOutputStream utiliza java.util.zip.ZipEntry
para representar una entrada de archivo zip.
Archivo ZIP de Java
Crear un archivo zip para un solo archivo es muy fácil, necesitamos crear un objeto ZipOutputStream a partir del objeto FileOutputStream del archivo de destino. Luego agregamos un nuevo ZipEntry al ZipOutputStream y usamos FileInputStream para leer el archivo fuente al objeto ZipOutputStream. Una vez que hayamos terminado de escribir, necesitamos cerrar ZipEntry y liberar todos los recursos.
Carpeta Zip de Java
Comprimir un directorio es un poco complicado, primero necesitamos obtener la lista de archivos como ruta absoluta. Luego procesar cada uno por separado. Necesitamos agregar un ZipEntry para cada archivo y utilizar FileInputStream para leer el contenido del archivo fuente en el ZipEntry correspondiente a ese archivo.
Ejemplo de compresión en Java
Aquí está el programa en Java que muestra cómo comprimir un solo archivo o comprimir una carpeta en 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);
// ahora comprimimos los archivos uno por uno
// creamos ZipOutputStream para escribir en el archivo zip
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
// para ZipEntry necesitamos mantener solo la ruta relativa del archivo, así que usamos substring en la ruta absoluta
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
// leemos el archivo y escribimos en 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 {
// creamos ZipOutputStream para escribir en el archivo zip
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
// agregamos una nueva Zip Entry al ZipOutputStream
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
// leemos el archivo y escribimos en ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
// cerramos la entrada zip para escribir en el archivo zip
zos.closeEntry();
// cerramos los recursos
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
La salida del programa de ejemplo de compresión en Java anterior es:
/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
Observa que al registrar los archivos en el directorio para comprimir, imprimo la ruta absoluta. Pero al agregar la entrada zip, estoy utilizando la ruta relativa desde el directorio para que al descomprimirlo, cree la misma estructura de directorios. Eso es todo para el ejemplo de compresión en Java.
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example