"Hej, Amigo!"

"Hej Ellie!"

"Idag ska vi studera I/O-strömmar."

"Ja, jag vet redan allt om dem. Vi använder klasserna FileInputStream och FileOutputStream här."

"Japp, och vilka av dessa klassers metoder känner du till?"

"Visst. Här är metoderna för FileInputStream:"

Metod Beskrivning
int read() Läser en byte och returnerar den.
int read(byte b[]) Läser en byte-array och returnerar den.
int read(byte b[], int off, int len) Läser en byte-array från strömmen.
long skip(long n) Hoppar över n byte, används vid läsning från strömmen.
int available() Returnerar antalet byte som fortfarande kan läsas från strömmen.
void close() Stänger strömmen.

"Spot on! Och metoderna för FileOutputStream?"

"Ta en titt:"

Metod Beskrivning
void write(int b) Skriver en byte till strömmen.
void write(byte b[]) Skriver en array av byte till strömmen.
void write(byte b[], int off, int len) Skriver en array av byte till strömmen.
void close() Stänger strömmen.

"Amigo, du överraskar mig!"

"Och sen lite!"

"Okej, då ska jag ge dig två nya klasser: ZipInputStream och ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Är det som en zip-fil?"

"Precis. Dessa strömmar är designade för att fungera med zip-filer. Du kan använda dem för att läsa eller skriva direkt till en zip-fil!"

"Holy moly! Hur intressant. Men en zip-fil kan inte ha en fil, utan flera. Hur fungerar de?"

"För det finns en annan specialklass: ZipEntry . Den presenterar en fil lagrad i arkivet. Du kan bara läsa ZipEntry- objekt från en ZipInputStream , och du kan bara skriva ZipEntry- objekt till en ZipOutputStream . Men det visar sig att du kan läsa och skriv till en ZipEntry precis som en vanlig fil."

"Kan du ge mig ett exempel på hur det fungerar?"

"Självklart. Här är ett exempel där vi skapar ett arkiv och lägger in en fil i det:"

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

"Hur intressant! Och att packa upp filer är lika enkelt?"

"Japp. Här är en kort beskrivning av metoderna för klasserna ZipEntry , ZipInputStream   och ZipOutputStream "

" ZipInputStream är en stream, så all ZipEntry kan bara läsas sekventiellt. Här är dess metoder:"

Metod Beskrivning
ZipEntry getNextEntry() Returnerar ett objekt som beskriver nästa ZipEntry (hoppar över alla byte i den aktuella posten).
void closeEntry() Stänger ingångsströmmen på den aktuella ZipEntry (hoppar över alla byte i den aktuella posten).
int available() Returnerar 1 det finns ZipEntries tillgängliga, annars 0.
int read(byte[] b, int off, int len) Läser bytes från den aktuella ZipEntry.
long skip(long n) Hoppar över n byte när du läser från strömmen.
void close() Stänger strömmen.

"Jag förstår inte riktigt."

"Det bästa du kan göra är att föreställa dig att du läser en textfil, och ZipEntries är som rader i filen. Du kan läsa data från den aktuella raden (den nuvarande ZipEntry ) eller hoppa från rad till rad ( getNextEntry , closeEntry ) ."

"Jag tror att jag förstår, men jag är inte säker."

"Här är ZipOutputStream och dess metoder:"

Metod Beskrivning
void setComment(String comment) Anger en kommentar till arkivet.
void setMethod(int method) Ställer in komprimeringsmetoden (typ).
void setLevel(int level) Ställer in komprimeringsnivån. Ju högre kompression, desto långsammare går det.
void putNextEntry(ZipEntry e) Lägger till en ny ZipEntry.
void closeEntry() Stänger den aktuella ZipEntry
void write(byte[] b, int off, int len) Skriver en uppsättning byte till den aktuella ZipEntry.
void close() Stänger strömmen.

"Men i exemplet ovan använde vi nästan inget av detta."

"Detta är valfria metoder. Du behöver inte ange komprimeringsnivån och metoden - standardinställningarna kommer att användas."

"Hmm. Det är inte så illa. Och ZipEntry?"

"Visst. Den enda andra informationen i en ZipEntry är hushållsinformation:"

Metod Beskrivning
String getName(), setName(String) Intern namnfil.
long getTime(), setTime(long) Förra gången ändrades posten.
long getCRC(), setCRC(long) Kontrollsumma.
long getSize(), setSize(long) Storlek före kompression.
int getMethod(), setMethod(int) Kompressionsmetod.
long get/setCompressedSize() Storlek efter dragkedja.
boolean isDirectory() Är posten en katalog?

"Det där ser inte särskilt svårt ut. Vad finns det inte att älska!"

"Utmärkt, då kommer Diego att ge dig uppgifter om det här ämnet också."

"Jag borde ha hållit käften."