[Metodos] Comprimir/Descomprimir un archivo ZIP

Comprimir un archivo ZIP

Para comprimir un Fichero ZIP(Puede ser rar) vamos a hacer uso de las siguientes clases java:
  1. Lo primero es tener nuestro objeto "File":
    • public File(String pathname)
    • Crea una nueva instancia de un objeto archivo(File) con la ruta pasada por parámetro.
    • Paramétros
    • String pathName - una cadena con la ruta donde deberia estar nuestro archivo a comprimir.
    • Arroja:
    • NullPointerException - Si el parametro del argumento es nulo

  2. Luego, clase File se encargara de comprobar realmente si existe o se puede acceder al archivo a comprimir a través del método:
    • public boolean exists()
    • Comprueba si existe el archivo o directorio indicado por esta vía de acceso abstracta.
    • Retorna:
    • verdadero si y sólo si existe el archivo o directorio indicado por esta vía de acceso abstracta; false en caso contrario
    • Arroja:
    • SecurityException - Si existe un administrador de seguridad y su método SecurityManager.checkwRite (java.lang.String) niega el acceso de lectura al archivo o directorio

  3. Pasamos a crear un objeto de FileOutputStream:
    • public FileOutputStream(String name) throws FileNotFoundException
    • Crea un flujo de salida de archivo(FileOutputStream) para escribir en el archivo con el nombre especificado por parámetros. Un nuevo objeto "FileDescriptor" se crea para representar la conección a este archivo.
      En primer lugar, si hay un controlador de seguridad, su método checkWrite() es llamado con el nombre como su argumento.
      Si el archivo existe, pero es un directorio inalcanzable para un archivo normal, o no existe, pero no se puede crear, o no se puede abrir por cualquier otra razón, entonces un FileNotFoundException es lanzada.
    • Paramétros:
    • String name - El nombre con la ruta donde deberia dejarse el archivo ZIP que vamos a crear
    • Arroja:
    • FileNotFoundException - si el archivo existe, pero es un directorio en lugar inalcanzable, o no existe, pero no se puede crear, o no se puede abrir por cualquier otra razón.
      SecurityException - si existe un administrador de seguridad y su método checkWrite() niega el acceso de escritura al archivo.

  4. Ahora crearemos el flujo de salida para el archivo ZIP, la clase ZipOutputStream:
    • public ZipOutputStream(OutputStream out)
    • Crea un nuevo ZIP output stream.
      TLa codificacion UTF-8 es usada para los nombres de las entradas y comentarios.
    • Parámetros:
    • OutPutStream out - Un objeto de la clase padre OutPutStream, o sus clases hija, como el objeto creado recientemente FileOutputStream.

  5. En este momento, procedemos a añadir los archivos, tantos como sean necesarios, al archivo ZIP mediante la clase ZipEntry:
    • public ZipEntry(String name)
    • Crea una nueva entrada al con la ruta del archivo pasado por parámetro.
    • Parámetros
    • String name - Una cadena con la ruta del archivo que queremos añadir para comprimir. Este va a ser el nombre interno dentro de la compresion, no tiene porque coincidir con el de fuera. Tambien podemos incluirlo dentro de una carpeta separando con barras.
    • Arroja:
    • NullPointerException - si el nombre de la entrada es nulo.
      IllegalArgumentException - si el nombre de la entrada es mayor que 0xFFFF bytes

  6. Ahora es el objeto ZipOutputStream quien llamara a su metodo putNextEntry con el objeto ZipEntry creado recientemente:
    • public void putNextEntry(ZipEntry e) throws IOException
    • Se pone a escribir una nueva entrada de archivo ZIP y posiciona al comienzo de la entrada. Cierra la entrada actual si todavía está activo. El método de compresión por defecto se utiliza sino se especifica ningún método de compresión para la entrada, y se utilizará la hora actual si la entrada no tiene tiempo de modificación configurada.
    • Parámetros:
    • ZipEntry e - La entrada ZIP para ser escrita.
    • Arroja:
    • ZipException - si se ha producido un error de formato ZIP
      IOException - si se ha producido un error de E / S

  7. El siguiente paso será crear un flujo de entrada de archivo: (FileInputputStream):
    • public FileInputStream(String name) throws FileNotFoundException
    • Crea un FileInputStream abriendo una conexión con un archivo real, el archivo esta denominado por el nombre de ruta de acceso en el sistema de archivos por la cadena pasada por parámetro.
      Un nuevo objeto FileDescriptor se crea para representar a este respecto archivo.
      En primer lugar, si hay un controlador de seguridad, su método checkRead() se llama con el argumento de nombre como su argumento.

      Si no existe el archivo llamado, es un directorio en lugar de un archivo normal, o por alguna otra razón no se pueden abrir para leer a continuación, un FileNotFoundException es lanzada.
    • Parámetros:
    • String name - cadena con el la ruta del archivo a comprimir.
    • Arroja:
    • FileNotFoundException - si el archivo existe, pero es un directorio en lugar inalcanzable, o no existe, pero no se puede crear, o no se puede abrir por cualquier otra razón.
      SecurityException - si existe un administrador de seguridad y su método checkWrite() niega el acceso de escritura al archivo.

  8. El objeto FileInputStream, el cual tiene seteado el archivo a comprimir, ira leyendolo a través de un método el cual recibe por parámetro un array de byte que crearemos para indicarle el tamaño a leer, 1024 bastara:
    • public int read(byte[] b) throws IOException
    • Lee hasta la longitud del array de bytes(dado por parámetro) de este flujo de entrada(objeto FileInputStream).
      Este método se bloquea hasta que alguna entrada está disponible.
    • Parámetros:
    • byte[] b - Un array de byte(que crearemos previamente) para obtener la longitud deseada.
    • Devuelve:
    • int (un entero)- Es el número total de bytes leídos en la memoria intermedia, ó (-1)menos uno si no hay más datos debido a que el final del archivo ha sido alcanzado.
    • Arroja:
    • IOException - Si ocurre algun error de entrada/Salida.

  9. El número devuelto por el metodo anteriormente utilizado (read(byte[] b )), lo almacenaremos en una variable del tipo intenger(int). Este sera usado para evaluar cuando se alcanza el final del archivo al pasar a menos uno (-1). Mientras sea un numero mayor el ZipOutputStream podra ir escribiendo el zip con el archivo deseado.

  10. Entonces ZipOutputStream ira escribiendo dentro del ciclo while con su método:

  11. Por ultimo, ir cerrando todos objetos instanciados con su metodo close().

Mi PseudoCódigo seria algo asi:
File aZipear = new File(archivo);

if (aZipear.exists()) { 

 FileOutputStream fos = new FileOutputStream(nombreZip);

 ZipOutputStream zos = new ZipOutputStream(fos);


 
 ZipEntry entradaZIP = new ZipEntry("subcarpeta/texto.txt");

 zos.putNextEntry(entradaZIP);


 
 FileInputStream fis = new FileInputStream(archivo);



 byte[] buffer = new byte[1024];

 int leido = 0;

 while (0 < (leido = fis.read(buffer))) {

  zos.write(buffer, 0, leido);

 } 



 fis.close();

 zos.closeEntry();

 zos.close();

 fos.close();


 
 System.out.println("Archivo zip creado exitosamente!");

} 

Método para ser llamado(puede ser estatico o no)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static void guardarZIP(String archivo, String nombreZip) {
    File aZipear = new File(archivo);
    if (aZipear.exists()) {
    try {
        FileOutputStream fos = new FileOutputStream(nombreZip);
        ZipOutputStream zos = new ZipOutputStream(fos);
   
        ZipEntry entradaZIP = new ZipEntry("subcarpeta/texto.txt");
        zos.putNextEntry(entradaZIP);
        FileInputStream fis = new FileInputStream(archivo);
  
        byte[] buffer = new byte[1024];
        int leido = 0;
        while (0 < (leido = fis.read(buffer))) {
            zos.write(buffer, 0, leido);
        }

        fis.close();
        zos.closeEntry();
        zos.close();
        fos.close();

        System.out.println("Archivo zip creado exitosamente!");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        System.err.println("El archivo a comprimir no existe!");
    }
}

Una posible llamada podria ser:
guardarZIP("C:\\blog\\archivoTexto.txt", "C:\\blog\\mizip.rar");


No hay comentarios:

Publicar un comentario