In Java: How to zip file from byte[] array?

JavaZip

Java Problem Overview


My application is receiving email through SMTP server. There are one or more attachments in the email and email attachment return as byte[] (using sun javamail api).

I am trying to zip the attachment files on the fly without writing them to disk first.

What is/are possible way to achieve this outcome?

Java Solutions


Solution 1 - Java

You can use Java's java.util.zip.ZipOutputStream to create a zip file in memory. For example:

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();
}

Solution 2 - Java

I have the same problem but i needed a many files in a zip.

 protected byte[] listBytesToZip(Map<String, byte[]> mapReporte) throws IOException {
    String extension = ".pdf";
	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();
}

Solution 3 - Java

You can create a zip file from byte array and return to 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());
        }
}

Solution 4 - Java

Maybe the java.util.zip package might help you

Since you're asking about how to convert from byte array I think (not tested) you can use the ByteArrayInputStream method

int 	read(byte[] b, int off, int len)
          Reads up to len bytes of data into an array of bytes from this input stream.

that you will feed to

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

Solution 5 - Java

Solution 6 - Java

ByteArrayInputStream bais = new ByteArrayInputStream(retByte);
                
ZipInputStream zis = new ZipInputStream(bais);
           
zis.getNextEntry();

Scanner sc = new Scanner(zis);
while (sc.hasNextLine()) {
    System.out.println("-->:" +sc.nextLine());
}

zis.closeEntry();
zis.close();

Solution 7 - Java

   byte[] createReport() {
    try {
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ZipArchiveOutputStream zipOutputStream = new 
     ZipArchiveOutputStream(byteArrayOutputStream);
     
     zipOutputStream.setMethod(ZipArchiveOutputStream.STORED);
     zipOutputStream.setEncoding(ENCODING);

     String text= "text";
     byte[] textBytes = text.getBytes(StandardCharsets.UTF_8);

     ArchiveEntry zipEntryReportObject = newStoredEntry("file.txt", textBytes);
     zipOutputStream.putArchiveEntry(zipEntryReportObject);
     zipOutputStream.write(textBytes);

     zipOutputStream.closeArchiveEntry();
     zipOutputStream.close();
    
     return byteArrayOutputStream.toByteArray();
     } catch (IOException e) {
       return null;
    }

and

ArchiveEntry newStoredEntry(String name, byte[] data) {
    ZipArchiveEntry zipEntry = new ZipArchiveEntry(name);
    zipEntry.setSize(data.length);
    zipEntry.setCompressedSize(zipEntry.getSize());
    CRC32 crc32 = new CRC32();
    crc32.update(data);
    zipEntry.setCrc(crc32.getValue());
    return zipEntry;
  }

Solution 8 - Java

public static void createZip(byte[] data) throws ZipException {
	ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(data));
	ZipParameters parameters = new ZipParameters();
	parameters.setFileNameInZip("bank.zip");
	new ZipFile("F:\\ssd\\bank.zip").addStream(new ByteArrayInputStream(data), parameters);
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionneticView Question on Stackoverflow
Solution 1 - JavaDave L.View Answer on Stackoverflow
Solution 2 - JavaJesús SánchezView Answer on Stackoverflow
Solution 3 - JavaMaciejView Answer on Stackoverflow
Solution 4 - JavaEricView Answer on Stackoverflow
Solution 5 - JavaOscarRyzView Answer on Stackoverflow
Solution 6 - JavaAlptekin T.View Answer on Stackoverflow
Solution 7 - JavaLeketoView Answer on Stackoverflow
Solution 8 - JavasudhansuView Answer on Stackoverflow