Decomprimere file .zip

DOMANDA:

Come decomprimere un file .zip in java?


RISPOSTA:

Java ci mette a disposizione numerosi strumenti per effettuare anche operazioni non proprio banali come la compressione e la decompressione di file.

Dopo aver visto come comprimere, oggi vediamo come decomprimere un file .zip, in modo da estrarne il contenuto.

La classe UnzipFile:

package compressione;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipFile {

private String zipPath;
private String destPath;
private final int BUFFER_SIZE = 4096;

   // zipPath indica dove si trova il file
   // destPat dove scompattarlo
   public UnzipFile(String zipPath, String destPath) {
      this.zipPath = zipPath;
      this.destPath = destPath;
   }

   public boolean unzip() {
      File fileZip = new File(zipPath);
      File destFolder = new File(destPath);

      // qualche controllo
      if (!fileZip.exists()) // se il file zip non esiste
         throw new IllegalArgumentException("UnzipFile: file o directory di origine inestistente: " + fileZip);

      if (!destFolder.exists()) // se la directory di destinazione non esiste
         throw new IllegalArgumentException("UnzipFile: file o directory di destinazione inesistente: " + destFolder);

      if (!destFolder.isDirectory()) // se non è una directory
         throw new IllegalArgumentException("UnzipFile: " + destFolder + " non è una directory");

      ZipInputStream zis = null;

      try {
         FileInputStream fis = new FileInputStream(zipPath);
         zis = new ZipInputStream(new BufferedInputStream(fis));
         ZipEntry entry;

         //scorre la lista dei file nell'archivio zip
         while((entry = zis.getNextEntry()) != null) {
            String path = destPath + "/" + entry.getName(); // path del file estratto
       
            File file = new File(path);
            if(file.exists()) // se un file uguale esiste già
                throw new IllegalArgumentException("UnzipFile: esiste un file con lo stesso nome nella directory: " + file);

            FileOutputStream fos = new FileOutputStream(path);
            BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE);

            //legge il file da estrarre
            int cont;
            byte data[] = new byte[BUFFER_SIZE];
            while((cont = zis.read(data, 0, BUFFER_SIZE)) != -1)
               dest.write(data, 0, cont); // scrive il file nella directory di destinazione

            dest.flush();
            dest.close(); // chiude il file in scrittura
         }

         return true;

      } catch (FileNotFoundException fnfe) {
         fnfe.printStackTrace();
      } catch (IOException ioe) {
         ioe.printStackTrace();
      } finally {
         try {
            if(zis != null)
               zis.close(); // chiude l'archivio zip in lettura
         } catch (IOException ioe) {
            ioe.printStackTrace();
         }
      }

      // qualora ci fosse qualche malfunzionamento
      return false;
    }
}


La classe per effettuare il Test di quanto appena visto:

package compressione;

public class TestUnzip {
   public static void main(String[] args) {

      UnzipFile unz = new UnzipFile("C:\\test.zip", "C:\\decomp");

      if(unz.unzip())
         System.out.println("Estrazione riuscita");
      else
         System.out.println("Estrazione fallita");
   }
}

Prima di eseguire la classe di test, assicuratevi di aver posizionato il file test.zip in C:\ e di aver creato la cartella "decomp" nella stessa directory. Lanciando TestUnzip troverete, come previsto, i file decompressi nella cartella.

(questo procedimento non è valido per i file .rar)


Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java