В Java: Как заархивировать файл из массива byte []?

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

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

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

10.12.2008 22:34:42
5 ОТВЕТОВ
РЕШЕНИЕ

Вы можете использовать java.util.zip.ZipOutputStream в Java для создания 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();
}
115
10.12.2008 22:48:17
Вы, сэр, спас мой день!
Leo 26.12.2016 13:19:25
@ Dave - может ZipOutputStream быть отправлен в качестве выходного сигнала JAX-RS
Varun 21.11.2017 06:04:11
@ У меня тот же случай, но мне нужно сжать 5 файлов. Есть ли какие-либо предложения.
Deva 24.01.2019 08:58:24
@Deva, вы можете повторить ZipEntry-часть для тех файлов, которые вам нравятся.
kai-dj 12.06.2019 10:16:01
@AshishBurnwal ZipOutputStream - это то, что выполняет фактическое сжатие и кодирование. Он берет байты из массива и создает сжатый поток байтов, которые передаются в ByteArrayOutputStream. Затем мы получаем доступ и возвращаем эти сжатые закодированные байты из этого базового потока, чтобы вернуть их.
Dave L. 16.10.2019 13:46:45

Может быть, пакет 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
10.12.2008 22:36:58

Вы должны использовать ZipOutputStream для этого.

http://java.sun.com/javase/6/docs/api/java/util/zip/ZipOutputStream.html

0
10.12.2008 22:42:24

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

У меня та же проблема, но мне нужно было много файлов в zip.

protected byte[] listBytesToZip(Map<String, byte[]> mapReporte, String extension) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    for (Entry<String, byte[]> reporte : mapReporte.entrySet()) {
        ZipEntry entry = new ZipEntry(reporte.getKey() + extension);
        entry.setSize(reporte.getValue().length);
        zos.putNextEntry(entry);
        zos.write(reporte.getValue());
    }
    zos.closeEntry();
    zos.close();
    return baos.toByteArray();
}
2
30.10.2018 01:42:47