„Hallo, Amigo!“

„Hallo, Ellie!“

„Heute werden wir I/O-Streams untersuchen.“

„Ja, ich weiß bereits alles darüber. Wir verwenden hier die Klassen FileInputStream und FileOutputStream.“

„Ja, und welche Methoden dieser Klassen kennen Sie?“

„Sicher. Hier sind die Methoden von FileInputStream:“

Methode Beschreibung
int read() Liest ein Byte und gibt es zurück.
int read(byte b[]) Liest ein Byte-Array und gibt es zurück.
int read(byte b[], int off, int len) Liest ein Byte-Array aus dem Stream.
long skip(long n) Überspringt n Bytes und wird beim Lesen aus dem Stream verwendet.
int available() Gibt die Anzahl der Bytes zurück, die noch aus dem Stream gelesen werden können.
void close() Schließt den Stream.

„Genau richtig! Und die Methoden von FileOutputStream?“

"Schau mal:"

Methode Beschreibung
void write(int b) Schreibt ein Byte in den Stream.
void write(byte b[]) Schreibt ein Array von Bytes in den Stream.
void write(byte b[], int off, int len) Schreibt ein Array von Bytes in den Stream.
void close() Schließt den Stream.

„Amigo, du überraschst mich!“

„Und noch mehr!“

„Gut, dann gebe ich Ihnen zwei neue Klassen: ZipInputStream und ZipOutputStream.“

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

Zip ? Ist das wie eine Zip-Datei?“

„Genau. Diese Streams sind für die Arbeit mit Zip-Dateien konzipiert. Sie können damit direkt in eine Zip-Datei lesen oder schreiben!“

„Holy Moly! Wie interessant. Aber eine Zip-Datei kann nicht nur eine, sondern mehrere Dateien enthalten. Wie funktionieren sie?“

„Dafür gibt es eine weitere spezielle Klasse: ZipEntry . Sie stellt eine im Archiv gespeicherte Datei dar. Sie können ZipEntry- Objekte nur aus einem ZipInputStream lesen und Sie können ZipEntry- Objekte nur in einen ZipOutputStream schreiben . Aber es stellt sich heraus, dass Sie lesen und Schreiben Sie in einen ZipEntry wie in eine normale Datei.

„Könnten Sie mir ein Beispiel dafür geben, wie es funktioniert?“

„Natürlich. Hier ist ein Beispiel, in dem wir ein Archiv erstellen und eine Datei darin ablegen:“

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

„Wie interessant! Und das Entpacken von Dateien ist genauso einfach?“

„Ja. Hier ist eine kurze Beschreibung der Methoden der Klassen ZipEntry , ZipInputStream   und ZipOutputStream .“

ZipInputStream ist ein Stream, daher können alle ZipEntrys nur sequentiell gelesen werden. Hier sind seine Methoden:“

Methode Beschreibung
ZipEntry getNextEntry() Gibt ein Objekt zurück, das den nächsten ZipEntry beschreibt (überspringt alle Bytes im aktuellen Eintrag).
void closeEntry() Schließt den Eingabestream im aktuellen ZipEntry (überspringt alle Bytes im aktuellen Eintrag).
int available() Gibt 1 zurück, sofern ZipEntries verfügbar sind, andernfalls 0.
int read(byte[] b, int off, int len) Liest Bytes aus dem aktuellen ZipEntry.
long skip(long n) Überspringt n Bytes beim Lesen aus dem Stream.
void close() Schließt den Stream.

„Ich verstehe es nicht wirklich.“

„Stellen Sie sich am besten vor, Sie lesen eine Textdatei und ZipEntries sind wie Zeilen in der Datei. Sie können Daten aus der aktuellen Zeile (dem aktuellen ZipEntry) lesen oder von Zeile zu Zeile springen ( getNextEntry , closeEntry ) . ."

„Ich glaube, ich verstehe, bin mir aber nicht sicher.“

„Hier ist ZipOutputStream und seine Methoden:“

Methode Beschreibung
void setComment(String comment) Setzt einen Kommentar zum Archiv.
void setMethod(int method) Legt die Komprimierungsmethode (Typ) fest.
void setLevel(int level) Legt die Komprimierungsstufe fest. Je höher die Komprimierung, desto langsamer geht es.
void putNextEntry(ZipEntry e) Fügt einen neuen ZipEntry hinzu.
void closeEntry() Schließt den aktuellen ZipEntry
void write(byte[] b, int off, int len) Schreibt eine Reihe von Bytes in den aktuellen ZipEntry.
void close() Schließt den Stream.

„Aber im obigen Beispiel haben wir davon fast nichts verwendet.“

„Dies sind optionale Methoden. Sie müssen die Komprimierungsstufe und -methode nicht angeben – es werden die Standardeinstellungen verwendet.“

„Hmm. Das ist nicht so schlimm. Und ZipEntry?“

„Sicher. Die einzigen anderen Informationen in einem ZipEntry sind Haushaltsinformationen:“

Methode Beschreibung
String getName(), setName(String) Interne Namensdatei.
long getTime(), setTime(long) Das letzte Mal, als der Eintrag geändert wurde.
long getCRC(), setCRC(long) Prüfsumme.
long getSize(), setSize(long) Größe vor Komprimierung.
int getMethod(), setMethod(int) Kompressionsverfahren.
long get/setCompressedSize() Größe nach dem Reißverschluss.
boolean isDirectory() Handelt es sich bei dem Eintrag um ein Verzeichnis?

„Das sieht nicht sehr schwer aus. Was gibt es da nicht zu lieben!“

„Ausgezeichnet, dann wird dir Diego auch Aufgaben zu diesem Thema geben.“

„Ich hätte meinen Mund halten sollen.“