Visualizzazione post con etichetta file. Mostra tutti i post
Visualizzazione post con etichetta file. Mostra tutti i post

mercoledì 5 maggio 2010

Decompressione di uno zip in Java

Algoritmo per la decompressione di uno zip in Java

/**
 * Decomprime uno ZipInputStream in una directory destinazione
 * @param input ZipInputStream da estrarre
 * @param output directory destinazione
 * @throws IOException
 */
public static void decompress(ZipInputStream input, File output) throws IOException
{
  ZipEntry zipEntry;
  while((zipEntry = input.getNextEntry()) != null)
  {
    boolean directory = zipEntry.isDirectory();
    if(directory)
    {
      File dir = new File(output, zipEntry.getName());
      if(!dir.exists())
        dir.mkdir();
      else if(dir.isDirectory())
        throw new IOException("Output directory \"" + dir.getAbsolutePath() + "\" is a file");
    }else
    {
      File decompressFile = new File(output, zipEntry.getName());
      if(decompressFile.exists())
        throw new IOException("Output file \"" + decompressFile.getAbsolutePath() + "\" already exists");
      FileOutputStream fos = new FileOutputStream(decompressFile);
      try{
        byte[] readBuffer = new byte[4096];
        int bytesIn = 0;
        while ((bytesIn = input.read(readBuffer)) != -1) {
          fos.write(readBuffer, 0, bytesIn);
        }
      }
      finally{
        fos.close();
      }
    }
  }
}

Invocazione tipica del metodo,
input: file da estrarre, output: directory destinazione


/**
 * Decomprime un file zip in una directory
 * @param input file zip da estrarre
 * @param output directory destinazione
 * @throws IOException
 */
public static void decompress(File input, File output) throws IOException
{
  ZipInputStream zis = new ZipInputStream(new FileInputStream(input));
  try{
    decompress(zis, output);
  }finally
  {
    zis.close();
  }
}

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();
}
}