Una realidad de este mundo es que el tamaño es muy importante y, aunque generalmente toda la gente piensa que cuanto más grande mejor, a veces necesitamos cosas pequeñas porque el espacio disponible en el mundo es limitado y, por eso, vamos a ver como comprimir en Java.
La realidad es que es muy, pero que muy sencillo comprimir en Java. Solamente necesitas saber que un “deflater” sirve para comprimir algo (ese algo puede ser un fichero, un String o cualquier cosa que pase por algún tipo de memoria).
La mejor manera de ver como funciona es con un ejemplo, y por eso os voy a enseñar un pequeño ejemplo de como comprimir en Java un fichero externo:
public void createCompressFile (String filename) throws Exception { FileInputStream fis = new FileInputStream(filename); FileOutputStream fos = new FileOutputStream(filename + ".compress"); DeflaterOutputStream dos = new DeflaterOutputStream(fos); dos.write(IOUtils.toByteArray(fis)); dos.close(); }
¿A qué es bastante sencillo? La función recibe un nombre de archivo como entrada, abre un FileInputStream a un fichero con ese nombre y crea un FileOutputStream a la salida (que es el nombre de entrada más “.compress”).
Ahora viene lo interesante, unimos la salida con el DeflaterOutputStream (que será el que comprima los datos) y escribimos directamente el array de bytes de la entrada a la salida a través de este DeflaterOutputStream. Con esto ya tenemos los datos comprimidos en la salida.
Finalmente solo tienes que cerrar el output stream y ya estará todo listo.
Nota: Recuerda que esto es solamente un ejemplo. Deberíamos controlar el nombre de entrada, ver que existe, manejar las excepciones, etc.
Vale, ya tenemos el fichero creado con un tamaño menor pero algún día querrás tenerlo en su tamaño original. Para ello solo tendrías que hacer algo como lo del siguiente ejemplo:
Vale, ya tenemos un fichero pequeño pero algún día querrás utilizarlo y para eso tendrá que volver a recuperar su tamaño original. Para ello tendrás que hacer algo como lo que se muestra en el siguiente ejemplo:
public void createUncompressFile (String oldFilename, String newFilename) throws Exception { FileInputStream fis = new FileInputStream(oldFilename); FileOutputStream fos = new FileOutputStream(newFilename); InflaterInputStream iis = new InflaterInputStream(fis); byte[] compressedFileBuffer = IOUtils.toByteArray(iis); fos.write(compressedFileBuffer); fos.close(); }
Como puedes ver, el procedimiento es muy similar al anterior.
- Primero establecemos la entrada y salida.
- Unimos la entrada con el “inflater” (¡lo queremos de nuevo grande!)
- Convertimos el inflater stream a un array de bytes
- Escribimos el array de bytes directamente en la salida
- Y ta chaan, ya tenemos el archivo generado, con su tamaño original y ya solo falta cerrarlo.
Nota: De la misma manera que comenté en la nota anterior… esto es solamente un ejemplo y tendría que ser mejorado. ¡¡¡No lo pongas directamente en producción!!!