« Salut Amigo ! »

« Salut, Élie ! »

"Aujourd'hui, nous allons étudier les flux d'E/S."

"Oui, je sais déjà tout à leur sujet. Nous utilisons ici les classes FileInputStream et FileOutputStream."

"Oui, et laquelle de ces méthodes de classes connais-tu ?"

"Bien sûr. Voici les méthodes de FileInputStream :"

Méthode Description
int read() Lit un octet et le renvoie.
int read(byte b[]) Lit un tableau d'octets et le renvoie.
int read(byte b[], int off, int len) Lit un tableau d'octets à partir du flux.
long skip(long n) Ignore n octets, utilisés lors de la lecture à partir du flux.
int available() Renvoie le nombre d'octets qui peuvent encore être lus à partir du flux.
void close() Ferme le flux.

"Spot on ! Et les méthodes de FileOutputStream ?"

"Regarde:"

Méthode Description
void write(int b) Écrit un octet dans le flux.
void write(byte b[]) Écrit un tableau d'octets dans le flux.
void write(byte b[], int off, int len) Écrit un tableau d'octets dans le flux.
void close() Ferme le flux.

« Amigo, tu me surprends !

« Et puis certains !

"Très bien, alors je vais vous donner deux nouvelles classes : ZipInputStream et ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? C'est comme un fichier zip ?"

"Exactement. Ces flux sont conçus pour fonctionner avec des fichiers zip. Vous pouvez les utiliser pour lire ou écrire directement dans un fichier zip !"

"Putain de moly ! Comme c'est intéressant. Mais un fichier zip peut contenir non pas un seul fichier, mais plusieurs. Comment fonctionnent-ils ?"

"Pour cela, il existe une autre classe spéciale : ZipEntry . Elle présente un fichier stocké dans l'archive. Vous ne pouvez lire que des objets ZipEntry à partir d'un ZipInputStream , et vous ne pouvez écrire que des objets ZipEntry dans un ZipOutputStream . Mais il s'avère que vous pouvez lire et écrire dans un ZipEntry comme un fichier normal."

"Pourriez-vous me donner un exemple de la façon dont cela fonctionne?"

"Bien sûr. Voici un exemple où nous créons une archive et y plaçons un fichier :"

Code
// Create an archive
FileOutputStream zipFile = new FileOutputStream("c:/archive.zip");
ZipOutputStream zip = new ZipOutputStream(zipFile);

//Put a ZipEntry into it
zip.putNextEntry(new ZipEntry("document.txt"));

//Copy the file «document-for-archive.txt» to the archive under the name «document.txt»
File file = new File("c:/document-for-archive.txt");
Files.copy(file.toPath(), zip);

// Close the archive
zip.close();

"Comme c'est intéressant ! Et décompresser des fichiers est tout aussi simple ?"

"Oui. Voici une brève description des méthodes des classes ZipEntry , ZipInputStream   et ZipOutputStream "

" ZipInputStream est un flux, donc tous les ZipEntry ne peuvent être lus que séquentiellement. Voici ses méthodes :"

Méthode Description
ZipEntry getNextEntry() Renvoie un objet décrivant la prochaine ZipEntry (ignore tous les octets de l'entrée actuelle).
void closeEntry() Ferme le flux d'entrée sur l'entrée Zip actuelle (ignore tous les octets de l'entrée actuelle).
int available() Renvoie 1 si ZipEntries est disponible, sinon 0.
int read(byte[] b, int off, int len) Lit les octets du ZipEntry actuel.
long skip(long n) Ignore n octets lors de la lecture à partir du flux.
void close() Ferme le flux.

"Je ne comprends pas vraiment."

"La meilleure chose à faire est d'imaginer que vous lisez un fichier texte et que les ZipEntries sont comme des lignes dans le fichier. Vous pouvez lire les données de la ligne actuelle (le ZipEntry actuel) ou passer d'une ligne à l'autre ( getNextEntry , closeEntry ) ."

"Je pense que je comprends, mais je ne suis pas sûr."

"Voici ZipOutputStream et ses méthodes :"

Méthode Description
void setComment(String comment) Définit un commentaire sur l'archive.
void setMethod(int method) Définit la méthode de compression (type).
void setLevel(int level) Définit le niveau de compression. Plus la compression est élevée, plus elle est lente.
void putNextEntry(ZipEntry e) Ajoute un nouveau ZipEntry.
void closeEntry() Ferme le ZipEntry actuel
void write(byte[] b, int off, int len) Écrit un ensemble d'octets dans le ZipEntry actuel.
void close() Ferme le flux.

"Mais dans l'exemple ci-dessus, nous n'avons utilisé presque rien de tout cela."

"Ce sont des méthodes facultatives. Vous n'avez pas besoin de spécifier le niveau de compression et la méthode - les paramètres par défaut seront utilisés."

"Hmm. Ce n'est pas si mal. Et ZipEntry ?"

"Bien sûr. Les seules autres informations contenues dans un ZipEntry sont des informations d'ordre interne :"

Méthode Description
String getName(), setName(String) Fichier de noms interne.
long getTime(), setTime(long) La dernière fois que l'entrée a été modifiée.
long getCRC(), setCRC(long) Somme de contrôle.
long getSize(), setSize(long) Taille avant compression.
int getMethod(), setMethod(int) Méthode de compression.
long get/setCompressedSize() Taille après zip.
boolean isDirectory() L'entrée est-elle un répertoire ?

"Cela n'a pas l'air très difficile. Qu'est-ce qu'il n'y a pas à aimer !"

"Excellent, alors Diego vous confiera également des tâches sur ce sujet."

"J'aurais dû me taire."