"Hallo Amigo!"

"Hallo, Ellie!"

"Vandaag gaan we I/O-streams bestuderen."

"Ja, ik weet er al alles van. We gebruiken hier de klassen FileInputStream en FileOutputStream."

"Ja, en welke methoden van deze klassen ken jij?"

"Natuurlijk. Hier zijn de methoden van FileInputStream:"

Methode Beschrijving
int read() Leest één byte en retourneert deze.
int read(byte b[]) Leest een byte-array en retourneert deze.
int read(byte b[], int off, int len) Leest een bytearray uit de stream.
long skip(long n) Slaat n bytes over, gebruikt bij het lezen van de stream.
int available() Retourneert het aantal bytes dat nog kan worden gelezen uit de stream.
void close() Sluit de stroom af.

"Spot on! En de methoden van FileOutputStream?"

"Kijk eens:"

Methode Beschrijving
void write(int b) Schrijft een byte naar de stream.
void write(byte b[]) Schrijft een reeks bytes naar de stream.
void write(byte b[], int off, int len) Schrijft een reeks bytes naar de stream.
void close() Sluit de stroom af.

"Amigo, je verrast me!"

"En dan een beetje!"

"Goed, dan geef ik je twee nieuwe klassen: ZipInputStream en ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Is dat zoiets als een zip-bestand?"

"Precies. Deze streams zijn ontworpen om met zip-bestanden te werken. Je kunt ze gebruiken om rechtstreeks naar een zip-bestand te lezen of ernaar te schrijven!"

"Holy moly! Wat interessant. Maar een zip-bestand kan niet één bestand hebben, maar meerdere. Hoe werken ze?"

"Daarvoor is er nog een speciale klasse: ZipEntry . Het presenteert een bestand dat is opgeslagen in het archief. Je kunt alleen ZipEntry- objecten lezen van een ZipInputStream en je kunt alleen ZipEntry- objecten schrijven naar een ZipOutputStream . Maar het blijkt dat je kunt lezen en schrijf naar een ZipEntry net als een gewoon bestand."

"Kun je me een voorbeeld geven van hoe het werkt?"

"Natuurlijk. Hier is een voorbeeld waarbij we een archief maken en er een bestand in plaatsen:"

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

"Wat interessant! En het uitpakken van bestanden is net zo eenvoudig?"

"Ja. Hier is een korte beschrijving van de methoden van de klassen ZipEntry , ZipInputStream   en ZipOutputStream "

" ZipInputStream is een stream, dus alle ZipEntry kan alleen opeenvolgend worden gelezen. Hier zijn de methoden:"

Methode Beschrijving
ZipEntry getNextEntry() Retourneert een object dat de volgende ZipEntry beschrijft (alle bytes in het huidige item worden overgeslagen).
void closeEntry() Sluit de invoerstroom op de huidige ZipEntry (sla alle bytes in de huidige invoer over).
int available() Retourneert 1 er zijn ZipEntries beschikbaar, anders 0.
int read(byte[] b, int off, int len) Leest bytes van de huidige ZipEntry.
long skip(long n) Slaat n bytes over bij het lezen van de stream.
void close() Sluit de stroom af.

"Ik begrijp het niet echt."

"Het beste wat je kunt doen is je voorstellen dat je een tekstbestand leest, en ZipEntries zijn als regels in het bestand. Je kunt gegevens lezen van de huidige regel (de huidige ZipEntry) of van regel naar regel springen ( getNextEntry , closeEntry ) ."

"Ik denk dat ik het begrijp, maar ik weet het niet zeker."

"Hier is ZipOutputStream en zijn methoden:"

Methode Beschrijving
void setComment(String comment) Stelt een opmerking over het archief in.
void setMethod(int method) Stelt de compressiemethode (type) in.
void setLevel(int level) Stelt het compressieniveau in. Hoe hoger de compressie, hoe langzamer het gaat.
void putNextEntry(ZipEntry e) Voegt een nieuwe ZipEntry toe.
void closeEntry() Sluit de huidige ZipEntry
void write(byte[] b, int off, int len) Schrijft een set bytes naar de huidige ZipEntry.
void close() Sluit de stroom af.

"Maar in het bovenstaande voorbeeld hebben we hier bijna niets van gebruikt."

"Dit zijn optionele methoden. U hoeft het compressieniveau en de methode niet op te geven - de standaardinstellingen worden gebruikt."

"Hmm. Dat is niet zo erg. En ZipEntry?"

"Natuurlijk. De enige andere informatie in een ZipEntry is huishoudelijke informatie:"

Methode Beschrijving
String getName(), setName(String) Intern naambestand.
long getTime(), setTime(long) De laatste keer dat de invoer is gewijzigd.
long getCRC(), setCRC(long) Controlesom.
long getSize(), setSize(long) Grootte vóór compressie.
int getMethod(), setMethod(int) Compressiemethode.
long get/setCompressedSize() Maat na ritsen.
boolean isDirectory() Is de invoer een directory?

"Dat ziet er niet erg moeilijk uit. Wat is er niet om lief te hebben!"

"Uitstekend, dan zal Diego je ook taken over dit onderwerp geven."

"Ik had mijn mond moeten houden."