2008-12-10 3 views
34

Мое приложение получает электронную почту через SMTP-сервер. В сообщении электронной почты и вложения электронной почты есть одно или несколько вложений в виде байта [] (с использованием java-файла api).В Java: как сделать zip-файл из массива byte []?

Я пытаюсь закрепить файлы вложений на лету, не записывая их на диск первым.

Что такое возможный способ достижения этого результата?

ответ

89

Вы можете использовать java.util.zip.ZipOutputStream Java, чтобы создать файл почтового индекса в памяти. Например:

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

Вы можете создать файл почтового индекса из массива байтов и вернуться к 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()); 
     } 
}