2008-12-10 15 views
34

Mi aplicación recibe correo electrónico a través del servidor SMTP. Hay uno o más archivos adjuntos en el archivo adjunto de correo electrónico y correo electrónico devueltos como byte [] (utilizando sun javamail api).En Java: ¿Cómo comprimir el archivo de la matriz byte []?

Estoy tratando de comprimir los archivos adjuntos sobre la marcha sin necesidad de escribirlos en el disco primero.

¿Cuál es/son la forma posible de lograr este resultado?

Respuesta

89

Puede utilizar java.util.zip.ZipOutputStream de Java para crear un archivo zip en la memoria. Por ejemplo:

public static byte[] zipBytes(String filename, byte[] input) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ZipOutputStream zos = new ZipOutputStream(baos); 
    ZipEntry entry = new ZipEntry(filename); 
    entry.setSize(input.length); 
    zos.putNextEntry(entry); 
    zos.write(input); 
    zos.closeEntry(); 
    zos.close(); 
    return baos.toByteArray(); 
} 
+2

Usted, señor, me salvó el día! – Leo

+0

@Dave - se puede enviar ZipOutputStream como salida jax-rs – Varun

1

Tal vez el paquete java.util.zip podría ayudarle a

Puesto que usted está preguntando acerca de cómo convertir de matriz de bytes creo (no probado), puede utilizar el método ByteArrayInputStream

int  read(byte[] b, int off, int len) 
      Reads up to len bytes of data into an array of bytes from this input stream. 

que va a alimentar a

ZipInputStream This class implements an input stream filter for reading files in the ZIP file format. 
0

Se puede crear un archivo zip de matriz de bytes y volver a streamedContent ui

public StreamedContent getXMLFile() { 
     try { 
      byte[] blobFromDB= null; 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ZipOutputStream zos = new ZipOutputStream(baos); 
      String fileName= "fileName"; 
      ZipEntry entry = new ZipEntry(fileName+".xml"); 
      entry.setSize(byteArray.length); 
      zos.putNextEntry(entry); 
      zos.write(byteArray); 
      zos.closeEntry(); 
      zos.close(); 
      InputStream is = new ByteArrayInputStream(baos.toByteArray()); 
      StreamedContent zipedFile= new DefaultStreamedContent(is, "application/zip", fileName+".zip", Charsets.UTF_8.name()); 
      return fileDownload; 
     } catch (IOException e) { 
      LOG.error("IOException e:{} ",e.getMessage()); 
     } catch (Exception ex) { 
      LOG.error("Exception ex:{} ",ex.getMessage()); 
     } 
}