web-dev-qa-db-fra.com

En Java: Comment compresser un fichier à partir d'un tableau d'octets []?

Mon application reçoit un courrier électronique via un serveur SMTP. L'e-mail contient une ou plusieurs pièces jointes renvoyées sous forme d'octet [] (avec Sun javamail api).

J'essaie de compresser les fichiers joints à la volée sans les écrire au préalable sur le disque.

Quel est/quels sont les moyens possibles pour atteindre ce résultat?

39
netic

Vous pouvez utiliser Java.util.Zip.ZipOutputStream de Java pour créer un fichier Zip en mémoire. Par exemple:

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();
}
101
Dave L.

Peut-être que le fichier Java.util.Zip package pourrait vous aider

Puisque vous demandez comment convertir un tableau d'octets, je pense (non testé), vous pouvez utiliser la méthode 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.

que tu nourriras à 

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

J'ai le même problème mais il me fallait plusieurs fichiers dans un fichier 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
Jesús Sánchez

Vous pouvez créer un fichier Zip à partir d'un tableau d'octets et revenir à l'interface utilisateur 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
Maciej

Vous devez utiliser un ZipOutputStream pour cela. 

http://Java.Sun.com/javase/6/docs/api/Java/util/Zip/ZipOutputStream.html

0
OscarRyz