Come creare un archivio .zip in Java

Creare archivi ZIP in Java

Creare archivi ZIP in Java

Creare archivi ZIP in Java
Zip Java

Durante lo sviluppo di applicazioni web o desktop ricorre spesso l’esigenza di consentire l’esportazione massiva di un numero alto di file, o semplicemente di velocizzare il download di un singolo file testuale.

Per questo motivo spesso la soluzione è quella di creare un archivio ZIP, operazione che in Java è molto semplice grazie alle classi del package java.util.zip. Vediamo come creare velocemente ed in maniera efficiente archivi zip a partire da un singolo oggetto java.io.File o da una List di istanze.

La classe ELbuildZip.java

Il task della creazione di un archivio ZIP in Java è ricorrente in diverse applicazioni, per cui abbiamo creato una libreria facilmente riutilizzabile sia in ambito web, desktop e mobile.

I metodi statici da chiamare sono 2:

  • ELbuildZip.zip(ArrayList<String> fnames, String fout);
  • ELbuildZip.zipFiles(ArrayList<File> fnames, String fout);

Il primo metodo consente di passare un ArrayList di String, che costituiscono i path assoluti (o relativi rispetto al punto di esecuzione corrente) dei file da zippare. Il secondo metodo invece permette di passare direttamente la lista di oggetti File.

Il secondo parametro in entrambi i casi è il percorso del file di output, ovvero del file .zip che stiamo creando. Nel caso di una applicazione web questo file potrebbe venir creato in una directory temporanea per poi esser servito come stream in una HTTP Response.

La validazione degli oggetti File (o delle String) passate è demandata alla classe chiamante.


/*
 * Copyright 2013 Luca Adamo <luca@elbuild.it>.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package elbuild.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 *
 * @author Luca Adamo <luca@elbuild.it>
 */
public class ELbuildZip {

public static void zip(ArrayList<String> fnames, String fout) {

try {
 FileOutputStream fos = new FileOutputStream(fout);
 ZipOutputStream zos = new ZipOutputStream(fos);

for (String filename : fnames){
 addToZipFile(filename, zos);
 }
 zos.close();
 fos.close();

} catch (FileNotFoundException e) {
 Logger.getLogger(ELbuildZip.class.getName()).log(Level.SEVERE, null, e);
 } catch (IOException e) {
 Logger.getLogger(ELbuildZip.class.getName()).log(Level.SEVERE, null, e);
 } catch (Exception e) {
 Logger.getLogger(ELbuildZip.class.getName()).log(Level.SEVERE, null, e);
 }

}

 public static void zipFiles(ArrayList<File> files, String fout) {

try {
 FileOutputStream fos = new FileOutputStream(fout);
 ZipOutputStream zos = new ZipOutputStream(fos);

for (File filename : files){
 addToZipFile(filename, zos);
 }
 zos.close();
 fos.close();
 } catch (FileNotFoundException e) {
 Logger.getLogger(ELbuildZip.class.getName()).log(Level.SEVERE, null, e);
 } catch (IOException e) {
 Logger.getLogger(ELbuildZip.class.getName()).log(Level.SEVERE, null, e);
 } catch (Exception e) {
 Logger.getLogger(ELbuildZip.class.getName()).log(Level.SEVERE, null, e);
 }

}

private static void addToZipFile(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException {

File file = new File(fileName);
 FileInputStream fis = new FileInputStream(file);
 ZipEntry zipEntry = new ZipEntry(fileName);
 zos.putNextEntry(zipEntry);

byte[] bytes = new byte[1024];
 int length;
 while ((length = fis.read(bytes)) >= 0) {
 zos.write(bytes, 0, length);
 }

zos.closeEntry();
 fis.close();
 }

 private static void addToZipFile(File f, ZipOutputStream zos) throws FileNotFoundException, IOException {
 FileInputStream fis = new FileInputStream(f);
 ZipEntry zipEntry = new ZipEntry(f.getName());
 zos.putNextEntry(zipEntry);

byte[] bytes = new byte[1024];
 int length;
 while ((length = fis.read(bytes)) >= 0) {
 zos.write(bytes, 0, length);
 }
 zos.flush();
 zos.closeEntry();
 fis.close();
 }
}

ELbuild, consulenza e sviluppo software Java

ELbuild offre consulenza per lo sviluppo di software in Java, sia in ambito web che desktop. Contattaci per sapere come possiamo aiutare la tua azienda in campo informatico.

Autore: Luca Adamo

Luca Adamo si è laureato con lode in Ingegneria delle Telecomunicazioni all'Università degli studi di Firenze ed è dottorando in Ingegneria Informatica, Multimedialità e Telecomunicazioni, sempre nella stessa facoltà. Le sue competenze tecniche includono lo sviluppo software, sia orientato al web che desktop, in C/C++ e Java (J2EE, J2SE, J2ME), l'amministrazione di macchine Unix-based, la gestione di reti di telecomunicazioni, ed il design di database relazionali.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *