В Java: Как заархивировать файл из массива byte []? - PullRequest
40 голосов
/ 11 декабря 2008

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

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

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

Ответы [ 5 ]

103 голосов
/ 11 декабря 2008

Вы можете использовать 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();
}
1 голос
/ 30 октября 2018

У меня та же проблема, но мне нужно было много файлов в 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();
}
1 голос
/ 11 декабря 2008

Может быть, пакет 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 марта 2017

Вы можете создать 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 голосов
/ 11 декабря 2008

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

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

...