Trabajando con una API para subir y bajar archivos de un servidor, me doy cuenta que todos los archivos los manejan como byte[] array, lo común es pasar esos archivos a base64 e incluso hay APIs que los convierte a esa base automáticamente si los devuelves en un json.
Para este caso necesitaba generar archivos zip y abrir archivos zip, todo en memoria sin escribir en el disco.
Estos métodos usa las clases propia que provee java: java.io y java.util.zip
Ejemplo para comprimir múltiples archivos byte[] array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public byte[] filesToZip(Map<String, byte[]> mapFiles) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(baos); try { for (Map.Entry<String, byte[]> file : mapFiles.entrySet()) { ZipEntry entry = new ZipEntry(file.getKey()); entry.setSize(file.getValue().length); zos.putNextEntry(entry); zos.write(file.getValue()); } zos.closeEntry(); zos.close(); } catch (java.io.IOException e) { // Manejo de excepciones } return baos.toByteArray(); } |
Ejemplo para descomprimir un zip tipo byte[] array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public Map<String, byte[]> zipToFiles(final byte[] zipFile) { Map<String, byte[]> mapFiles = new HashMap<>(); ZipInputStream zi; try { //Test local //FileOutputStream fos = new FileOutputStream("C:/test/archivo_descargado.zip"); //fos.write(zipFile); //fos.close(); zi = new ZipInputStream(new ByteArrayInputStream(zipFile)); ZipEntry zipEntry; while ((zipEntry = zi.getNextEntry()) != null) { mapFiles.put(zipEntry.getName(), zi.readAllBytes()); } zi.closeEntry(); zi.close(); } catch (java.io.IOException e) { // Manejo de excepciones } return mapFiles; } |
No entro en detalles ya que es bastante simple y básico, aunque hay librerías dedicadas para ello, el Zip es un estándar universal y es el más recomendado para cualquier proceso.