GZIPOutputStream
, et la lecture
GZIPInputStream
. Ces deux classes étendent indirectement
OutputStream
et
InputStream
respectivement, et prennent les mêmes objets en paramètre.
Ces classes se trouvent dans le package
java.util.zip
La création d'un fichier GZip est donc immédiate.
Exemple 132. Utilisation de flux GZip
// dans une méthode main // déclaration d'un fichier File fichier = new File("tmp/bonjour.txt.gz") ; // création d'un flux compressé sur ce fichier GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(fichier)) ; // création d'un flux data sur ce flux compressé DataOutputStream dos = new DataOutputStream(gzos) ; // écriture de Bonjour le monde ! dos.writeUTF("Bonjour le monde !") ; // fermeture de ce flux, à mettre dans un bloc finally gzos.close() ; // puis ouverture du flux compressé sur ce fichier GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(fichier)) ; // ouverture d'un flux data sur ce flux compressé DataInputStream dis = new DataInputStream(gzis) ; // lecture d'une chaîne de caractères String lue = dis.readUTF() ; // fermeture du flux dans un bloc finally gzis.close() ; System.out.println(lue) ;
ZipEntry
. Pour créer un tel élément dans le fichier Zip, il faut l'ajouter au flux par appel à sa méthode
createEntry()
. Le flux de lecture expose une méthode
nextEntry()
, qui permet de lire les entrées d'un fichier zip les unes à la suite des autres. Voyons ceci sur un exemple.
Exemple 133. Création d'un fichier Zip
// dans une méthode main // déclaration d'un fichier File fichier = new File("tmp/bonjour.zip") ; // ouverture d'un flux Zip sur ce fichier ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fichier)) ; // création d'un répertoire : il s'agit d'une entrée dont le nom // se termine par un / ZipEntry entry = new ZipEntry("vide/") ; zos.putNextEntry(entry) ; // création d'un autre répertoire entry = new ZipEntry("bonjour/") ; zos.putNextEntry(entry) ; // création d'un fichier Bonjour-1.txt dans ce répertoire entry = new ZipEntry("bonjour/Bonjour-1.txt") ; zos.putNextEntry(entry) ; // ouverture d'un flux Data sur ce flux Zip DataOutputStream dos = new DataOutputStream(zos) ; // écriture d'un message dans ce fichier dos.writeUTF("Bonjour le monde ! [1]") ; // création d'un autre fichier entry = new ZipEntry("Bonjour-2.txt") ; zos.putNextEntry(entry) ; // écriture d'un message dans ce fichier dos.writeUTF("Bonjour le monde ! [2]") ; // fermeture d'un fichier dans le bloc finally dos.close() ;
bonjour.zip
à l'aide d'un utilitaire classique, tel que Winzip, WinRAR ou 7z. On constate bien que ce fichier comporte deux répertoires internes, et nos deux fichiers, le premier dans le répertoire
bonjour
, et le second dans le répertoire racine.
Écrivons maintenant le code de lecture de ce fichier. Ce code doit commencer par analyser les entrées de ce fichier, et tester à chaque fois si cette entrée est un répertoire ou un fichier. S'il s'agit d'un fichier, alors on peut lire son contenu.
Exemple 134. Lecture d'un fichier Zip
// ouverture d'un flux Zip sur le fichier de l'exemple précédent ZipInputStream zis = new ZipInputStream(new FileInputStream(fichier)) ; // ouverture d'un flux Data sur ce flux DataInputStream dis = new DataInputStream(zis) ; // lecture de la première entrèe // cette méthode retourne null s'il n'y a plus d'entrée à lire entry = zis.getNextEntry() ; while (entry != null) { if (entry.isDirectory()) { // cette entrée est un répertoire, on affiche son nom System.out.println("Répertoire : " + entry) ; } else { // cette entrée est un fichier, on affiche son contenu System.out.println("Fichier : " + entry) ; System.out.println(dis.readUTF()) ; } // on boucle sur toutes les entrées entry = zis.getNextEntry() ; }
Répertoire : vide/ Répertoire : bonjour/ Fichier : bonjour/Bonjour-1.txt Bonjour le monde ! [1] Fichier : Bonjour-2.txt Bonjour le monde ! [2]
String
StringBuffer
et
StringBuilder