2008-12-10 40 views
34

我的應用程序正在通過SMTP服務器接收電子郵件。電子郵件和電子郵件附件中有一個或多個附件以byte []形式返回(使用sun javamail api)。在Java中:如何從byte []數組中壓縮文件?

我試圖壓縮附件中的文件,而不先寫入磁盤。

什麼是/可能的方法來實現這一結果?

回答

89

您可以使用Java的java.util.zip.ZipOutputStream中在內存中創建一個zip文件。例如:

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

您先生,救了我的天! – Leo 2016-12-26 13:19:25

1

也許java.util.zip包可以幫助你

既然你問有關如何從字節數組轉換,我認爲(未測試),你可以使用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. 

你養活到

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

您可以從字節數組創建一個zip文件,並返回到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()); 
     } 
}