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;
}
}
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");
}
}
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
Posta un commento