"Hei, Amigo!"

"Hei, Ellie!"

"I dag skal vi studere I/O-strømmer."

"Ja, jeg vet allerede alt om dem. Vi bruker FileInputStream- og FileOutputStream-klassene her."

"Ja, og hvilke av disse klassenes metoder kjenner du?"

"Jada. Her er metodene for FileInputStream:"

Metode Beskrivelse
int read() Leser én byte og returnerer den.
int read(byte b[]) Leser en byte-array og returnerer den.
int read(byte b[], int off, int len) Leser en byte-array fra strømmen.
long skip(long n) Hopper over n byte, brukt når du leser fra strømmen.
int available() Returnerer antall byte som fortsatt kan leses fra strømmen.
void close() Lukker strømmen.

"Spot on! Og metodene til FileOutputStream?"

"Ta en titt:"

Metode Beskrivelse
void write(int b) Skriver én byte til strømmen.
void write(byte b[]) Skriver en rekke byte til strømmen.
void write(byte b[], int off, int len) Skriver en rekke byte til strømmen.
void close() Lukker strømmen.

"Amigo, du overrasker meg!"

"Og litt til!"

"Fint, da skal jeg gi deg to nye klasser: ZipInputStream og ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Er det som en zip-fil?"

"Akkurat. Disse strømmene er laget for å fungere med zip-filer. Du kan bruke dem til å lese eller skrive rett til en zip-fil!"

"Holy moly! Hvor interessant. Men en zip-fil kan ikke ha én fil, men flere. Hvordan fungerer de?"

"For det er det en annen spesiell klasse: ZipEntry . Den presenterer en fil som er lagret i arkivet. Du kan bare lese ZipEntry- objekter fra en ZipInputStream , og du kan bare skrive ZipEntry- objekter til en ZipOutputStream . Men det viser seg at du kan lese og skriv til en ZipEntry akkurat som en vanlig fil."

"Kan du gi meg et eksempel på hvordan det fungerer?"

"Selvfølgelig. Her er et eksempel hvor vi lager et arkiv og legger en fil i det:"

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

"Hvor interessant! Og det er like enkelt å pakke ut filer?"

"Jepp. Her er en kort beskrivelse av metodene til klassene ZipEntry , ZipInputStream   og ZipOutputStream "

" ZipInputStream er en strøm, så all ZipEntry kan bare leses sekvensielt. Her er metodene:"

Metode Beskrivelse
ZipEntry getNextEntry() Returnerer et objekt som beskriver neste ZipEntry (hopper over alle byte i gjeldende oppføring).
void closeEntry() Lukker inndatastrømmen på gjeldende ZipEntry (hopper over alle byte i gjeldende oppføring).
int available() Returnerer 1 det er ZipEntries tilgjengelig, ellers 0.
int read(byte[] b, int off, int len) Leser bytes fra gjeldende ZipEntry.
long skip(long n) Hopper over n byte når du leser fra strømmen.
void close() Lukker strømmen.

"Jeg forstår egentlig ikke."

"Det beste du kan gjøre er å forestille deg at du leser en tekstfil, og ZipEntries er som linjer i filen. Du kan lese data fra gjeldende linje (den nåværende ZipEntry ) eller hoppe fra linje til linje ( getNextEntry , closeEntry ) ."

"Jeg tror jeg forstår, men jeg er ikke sikker."

"Her er ZipOutputStream og dets metoder:"

Metode Beskrivelse
void setComment(String comment) Setter en kommentar til arkivet.
void setMethod(int method) Angir komprimeringsmetoden (type).
void setLevel(int level) Stiller inn komprimeringsnivået. Jo høyere kompresjon, jo saktere går det.
void putNextEntry(ZipEntry e) Legger til en ny ZipEntry.
void closeEntry() Lukker gjeldende ZipEntry
void write(byte[] b, int off, int len) Skriver et sett med byte til gjeldende ZipEntry.
void close() Lukker strømmen.

"Men i eksemplet ovenfor brukte vi nesten ingenting av dette."

"Dette er valgfrie metoder. Du trenger ikke spesifisere komprimeringsnivået og -metoden - standardinnstillingene vil bli brukt."

"Hmm. Det er ikke så ille. Og ZipEntry?"

"Jada. Den eneste andre informasjonen i en ZipEntry er husholdningsinformasjon:"

Metode Beskrivelse
String getName(), setName(String) Intern navnefil.
long getTime(), setTime(long) Forrige gang oppføringen ble endret.
long getCRC(), setCRC(long) Sjekksum.
long getSize(), setSize(long) Størrelse før kompresjon.
int getMethod(), setMethod(int) Kompresjonsmetode.
long get/setCompressedSize() Størrelse etter glidelås.
boolean isDirectory() Er oppføringen en katalog?

"Det ser ikke veldig vanskelig ut. Hva er det ikke å elske!"

"Utmerket, da vil Diego gi deg oppgaver om dette emnet også."

— Jeg burde ha holdt kjeft.