web-dev-qa-db-fra.com

Créer un fichier Zip en mémoire

J'essaie de compresser un fichier (par exemple foo.csv) et de le télécharger sur un serveur. J'ai une version de travail qui crée une copie locale, puis supprime la copie locale. Comment compresser un fichier pour pouvoir l'envoyer sans écrire sur le disque dur et le faire uniquement en mémoire?

Utilisez ByteArrayOutputStream avec ZipOutputStream pour accomplir la tâche.

vous pouvez utiliser ZipEntry pour spécifier les fichiers à inclure dans le fichier Zip.

Voici un exemple d'utilisation des classes ci-dessus,

String s = "hello world";

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try(ZipOutputStream zos = new ZipOutputStream(baos)) {

  /* File is not on the disk, test.txt indicates
     only the file name to be put into the Zip */
  ZipEntry entry = new ZipEntry("test.txt"); 

  zos.putNextEntry(entry);
  zos.write(s.getBytes());
  zos.closeEntry();

  /* use more Entries to add more files
     and use closeEntry() to close each file entry */

  } catch(IOException ioe) {
    ioe.printStackTrace();
  }

maintenant baos contient votre fichier Zip en tant que stream

Comme l'API NIO.2, qui a été introduite dans Java SE 7, prend en charge les systèmes de fichiers personnalisés, vous pouvez essayer de combiner un système de fichiers en mémoire comme https://github.com/marschall/memoryfilesystem et le système de fichiers Zip fourni par Oracle.

Remarque: J'ai écrit certaines classes d'utilitaires pour fonctionner avec le système de fichiers Zip.

La bibliothèque est Open Source et pourrait vous aider à démarrer.

Voici le tutoriel: http://softsmithy.sourceforge.net/lib/0.4/docs/tutorial/nio-file/index.html

Vous pouvez télécharger la bibliothèque ici: http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.4/

Ou avec Maven:

<dependency>  
    <groupId>org.softsmithy.lib</groupId>  
    <artifactId>softsmithy-lib-core</artifactId>  
    <version>0.4</version>   
</dependency>  
3
Puce