sabato 1 maggio 2010

Zip di una directory in java

Metodo ricorsivo per creare uno zip di una directory o di un file in Java

/**
* Aggiunge un File (file o directory) ad uno ZipOutputStream
* a partire da un certo path interno allo ZipOutputStream
* @param f File da aggiungere all'archivio
* @param path Path interno all'archivio in cui mettere il file
* @param zos ZipOutputStream che rappresenta l'archivio
* @throws IOException
*/
public static void compress(File f, String path, ZipOutputStream zos) throws IOException
{
boolean isDirectory = f.isDirectory();
//le directory terminano con "/", altrmineti sono file
final String nextPath = path + f.getName() + (isDirectory ? "/" : "");
ZipEntry zipEntry = new ZipEntry(nextPath);
zos.putNextEntry(zipEntry);
if(isDirectory)
{
File[] child = f.listFiles();
//ricorsione per ogni figlio
for(int i = 0; i < child.length; i++)
{
compress(child[i], nextPath, zos);
}
}else if(f.isFile())
{
FileInputStream fis = new FileInputStream(f);
byte[] readBuffer = new byte[4096];
int bytesIn = 0;
// inserisce il file nell'ultima zipEntry aggiunta allo ZipOutputStream
while ((bytesIn = fis.read(readBuffer)) != -1) {
zos.write(readBuffer, 0, bytesIn);
}
fis.close();
}
}

Invocazione del metodo:


/**
* Crea un archivio con il File (file o directory) specificato come
* paramentro, il path di partenza è vuoto
* @param input
* @param output
* @throws IOException
*/
public static void compress(File input, File output) throws IOException
{
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(output));
try{
compress(input,"", zos);
}finally
{
zos.close();
}
}

1 commento: