"Hej, Amigo!"

"Hej, Ellie!"

"I dag skal vi studere I/O-streams."

"Ja, jeg ved allerede alt om dem. Vi bruger klasserne FileInputStream og FileOutputStream her."

"Ja, og hvilke af disse klassers metoder kender du?"

"Sikkert. Her er metoderne til FileInputStream:"

Metode Beskrivelse
int read() Læser en byte og returnerer den.
int read(byte b[]) Læser et byte-array og returnerer det.
int read(byte b[], int off, int len) Læser et byte-array fra strømmen.
long skip(long n) Springer n bytes over, brugt ved læsning fra streamen.
int available() Returnerer antallet af bytes, der stadig kan læses fra strømmen.
void close() Lukker strømmen.

"Spot on! Og metoderne til FileOutputStream?"

"Tag et kig:"

Metode Beskrivelse
void write(int b) Skriver en byte til strømmen.
void write(byte b[]) Skriver et array af bytes til strømmen.
void write(byte b[], int off, int len) Skriver et array af bytes til strømmen.
void close() Lukker strømmen.

"Amigo, du overrasker mig!"

"Og så nogle!"

"Okay, så giver jeg dig to nye klasser: ZipInputStream og ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

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

"Nøjagtigt. Disse streams er designet til at fungere med zip-filer. Du kan bruge dem til at læse eller skrive direkte til en zip-fil!"

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

"Til det er der en anden speciel klasse: ZipEntry . Den præsenterer en fil gemt i arkivet. Du kan kun læse ZipEntry- objekter fra en ZipInputStream , og du kan kun skrive ZipEntry- objekter til en ZipOutputStream . Men det viser sig, at du kan læse og skriv til en ZipEntry ligesom en almindelig fil."

"Kan du give mig et eksempel på, hvordan det virker?"

"Selvfølgelig. Her er et eksempel, hvor vi opretter et arkiv og lægger 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 lige så nemt at pakke filer ud?"

"Jep. Her er en kort beskrivelse af metoderne i klasserne ZipEntry , ZipInputStream   og ZipOutputStream "

" ZipInputStream er en stream, så al ZipEntry kan kun læses sekventielt. Her er dens metoder:"

Metode Beskrivelse
ZipEntry getNextEntry() Returnerer et objekt, der beskriver den næste ZipEntry (springer alle bytes over i den aktuelle post).
void closeEntry() Lukker inputstream på den aktuelle ZipEntry (springer alle bytes over i den aktuelle post).
int available() Returnerer 1, der er ZipEntries tilgængelige, ellers 0.
int read(byte[] b, int off, int len) Læser bytes fra den aktuelle ZipEntry.
long skip(long n) Springer n bytes over, når du læser fra streamen.
void close() Lukker strømmen.

"Jeg forstår det ikke rigtigt."

"Den bedste ting at gøre er at forestille sig, at du læser en tekstfil, og ZipEntries er som linjer i filen. Du kan læse data fra den aktuelle linje (den aktuelle 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) Indstiller en kommentar til arkivet.
void setMethod(int method) Indstiller komprimeringsmetoden (type).
void setLevel(int level) Indstiller kompressionsniveauet. Jo højere kompression, jo langsommere går det.
void putNextEntry(ZipEntry e) Tilføjer en ny ZipEntry.
void closeEntry() Lukker den aktuelle ZipEntry
void write(byte[] b, int off, int len) Skriver et sæt bytes til den aktuelle ZipEntry.
void close() Lukker strømmen.

"Men i eksemplet ovenfor brugte vi næsten intet af dette."

"Dette er valgfrie metoder. Du behøver ikke at angive komprimeringsniveauet og -metoden - standardindstillingerne vil blive brugt."

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

"Selvfølgelig. Den eneste anden information i en ZipEntry er husholdningsoplysninger:"

Metode Beskrivelse
String getName(), setName(String) Intern navnefil.
long getTime(), setTime(long) Sidste gang blev posten ændret.
long getCRC(), setCRC(long) Kontrolsum.
long getSize(), setSize(long) Størrelse før kompression.
int getMethod(), setMethod(int) Kompressionsmetode.
long get/setCompressedSize() Størrelse efter lynlås.
boolean isDirectory() Er posten en mappe?

"Det ser ikke særlig svært ud. Hvad er der ikke at elske!"

"Fremragende, så vil Diego også give dig opgaver om dette emne."

"Jeg skulle have holdt min mund."