В Java: как zip файл из массива byte []?

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

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

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

Ответ 1

Вы можете использовать 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

Возможно, пакет 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.

Ответ 4

Вы можете создать 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());
        }
}