lunes, 27 de agosto de 2012

Java Compresion Alternativa gzip y zip

Saludos,  recientemente teníamos la necesidad de comprimir un archivo pdf, la primera prueba de compresión la hicimos con zip con las librerías nativas de java, el archivo era de aproximadamente 90 megas y el resultado era de 40, se necesitaba comprimir mucho mas, entre las alternativas que se considero pues era rar pero dado que habría que hacerse ejecutándolo fuera de java no me agradaba mucho, buscando en internet también encontramos LZMA SDK, la documentación me pareció un poco confusa y buscando ejemplos de como usarlo me tope con este link de stackoverflow http://stackoverflow.com/questions/5481487/how-to-use-lzma-sdk-to-compress-decompress-in-java en donde indicaba una implementacion nativa del algoritmo LZMA2 en java y dicha librería resulto muy fácil de usar, el link es http://tukaani.org/xz/java.html y en la misma pregunta de stackoverflow se encuentra un ejemplo muy sencillo de su uso.

Solo tenemos que baja el jar y agregarlo a nuestro proyecto, en caso de usar maven tambien se encuentra en el repositorio central y podemos agregarlo como dependencia

<dependency>  
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
<version>1.0</version>
</dependency>


y en el codigo seria algo asi  (tomado de la respuesta de stackoverlfow)


FileInputStream inFile = new FileInputStream("src.tar");
FileOutputStream outfile = new FileOutputStream("src.tar.xz");

LZMA2Options options = new LZMA2Options();

options.setPreset(7); // play with this number: 6 is default but 7 works better for mid sized archives ( > 8mb)
XZOutputStream out = new XZOutputStream(outfile, options);
byte[] buf = new byte[8192];
int size;
while ((size = inFile.read(buf)) != -1)
   out.write(buf, 0, size);

out.finish();

Con la compresion xz el archivo de 90 megas se redujo casi 6 megas, el archivo como lo mencione es un pdf que contiene texto e imagenes, si fuera solo texto pues bastaria usar zip, por eso opte por esta alternativa