Comprimere i dati (ZIP e JAR)
In questo articolo impareremo come comprimere i nostri dati in java utilizzando java.util.jar e java.util.zip. Leggere e scrivere file JAR, ZIP e GZIP non è cosi difficile.
Il formato ZIP è quello più diffuso nel mondo, fin dallo storico PKZIP della PKWARE per MS-DOS. Il formato GZIP (.tar.gz) e’ il suo equivalente nel mondo Unix/Linux. La differenza fondamentale è che lo ZIP è in grado di comprimere intere directory e collezioni di files, mentre GZIP si limita a comprimere un solo file (il .tar).
Il JAR si basa sull’algoritmo dello ZIP e solitamente include un file manifest che contiene informazioni sul contenuto. Ovviamente si tratta di compressioni senza DATA LOSS e quindi completamente reversibili.
java.util.zip è il package di base per la lettura e scrittura di file compressi. La classe base è Deflater che si occupa di implementare l’algoritmo di compressione più utilizzato (Lempel Ziv). Il suo equivalente in fase di decompressione è la classe Inflater. Per creare un file zip però possiamo utilizzare direttamente le classi ZipEntry e ZipOutputStream, che ci permettono di gestire il file zip allo stesso modo in cui gestiamo i file in Java.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.zip.*; import java.io.*; public class CreaZip { public static void main(String[] args) throws Exception { FileOutputStream f = new FileOutputStream("test.zip"); ZipOutputStream out = new ZipOutputStream( new BufferedOutputStream(f)); out.setComment("Java Zip"); for (int i = 0; i < args.length; i++) { System.out.println("Writing file " + args[i]); BufferedReader in = new BufferedReader( new FileReader(args[i])); out.putNextEntry(new ZipEntry(args[i])); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); } out.close(); } } |
Nel seguente esempio possiamo invece vedere come sia semplice leggere informazioni da un file zip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.Enumeration; import java.util.zip.*; import java.io.*; public class StampaZip { public static void main(String[] Args) throws Exception { ZipFile f = new ZipFile("file.zip"); for (Enumeration e = f.entries(); e.hasMoreElements();) { ZipEntry zf = (ZipEntry)e.nextElement(); if (zf.isDirectory()) System.out.println("Directory "+zf.getName()); else System.out.println("File "+zf.getName()); } f.close(); } } |
Il codice è piuttosto semplice e non richiede altro che una lettura attenta. Per maggiori informazioni vi rimando alle API dei due package: