2008-12-10 8 views
34

Mon application reçoit des e-mails via le serveur SMTP. Il y a une ou plusieurs pièces jointes dans la pièce jointe de l'e-mail et de l'e-mail en octet [] (en utilisant sun javamail api). J'essaie de compresser les fichiers attachés à la volée sans les écrire sur le disque d'abord.En Java: Comment compresser le fichier du tableau byte []?

Quelle est/est la voie possible pour atteindre ce résultat?

Répondre

89

Vous pouvez utiliser java.util.zip.ZipOutputStream Java pour créer un fichier zip en mémoire. Par exemple:

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

Vous monsieur, a sauvé ma journée! – Leo

+0

@Dave - ZipOutputStream peut-il être envoyé en tant que sortie jax-rs? – Varun

1

Peut-être que le paquet java.util.zip pourrait vous aider

Puisque vous vous demandez comment convertir tableau d'octets que je pense (non testé), vous pouvez utiliser la méthode 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 vous nourrir à

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

Vous pouvez créer un fichier zip à partir de tableau d'octets et revenir à ui streamedContent

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()); 
     } 
} 
Questions connexes