"Bună, Amigo!"

— Bună, Ellie!

„Astăzi vom studia fluxurile I/O”.

"Da, știu deja totul despre ei. Folosim clasele FileInputStream și FileOutputStream aici."

"Da, și care dintre metodele acestor clase cunoști?"

"Sigur. Iată metodele FileInputStream:"

Metodă Descriere
int read() Citește un octet și îl returnează.
int read(byte b[]) Citește o matrice de octeți și o returnează.
int read(byte b[], int off, int len) Citește o matrice de octeți din flux.
long skip(long n) Omite n octeți, utilizați la citirea din flux.
int available() Returnează numărul de octeți care pot fi încă citiți din flux.
void close() Închide fluxul.

"La bun sfârșit! Și metodele FileOutputStream?"

„Aruncă o privire:”

Metodă Descriere
void write(int b) Scrie un octet în flux.
void write(byte b[]) Scrie o matrice de octeți în flux.
void write(byte b[], int off, int len) Scrie o matrice de octeți în flux.
void close() Închide fluxul.

„Amigo, mă surprinzi!”

— Și apoi niște!

„Bine, atunci îți voi oferi două clase noi: ZipInputStream și ZipOutputStream”.

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Este ca un fișier zip?"

"Exact. Aceste fluxuri sunt concepute pentru a funcționa cu fișiere zip. Le puteți folosi pentru a citi sau a scrie direct într-un fișier zip!"

"Holy Moly! Ce interesant. Dar un fișier zip poate avea nu un fișier, ci mai multe. Cum funcționează?"

„Pentru asta, există o altă clasă specială: ZipEntry . Prezintă un fișier stocat în arhivă. Puteți citi doar obiecte ZipEntry dintr-un ZipInputStream și puteți scrie doar obiecte ZipEntry într-un ZipOutputStream . Dar se dovedește că puteți citi și scrieți într-un ZipEntry la fel ca un fișier obișnuit."

„Poți să-mi dai un exemplu despre cum funcționează?”

"Desigur. Iată un exemplu în care creăm o arhivă și punem un fișier în ea:"

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

"Ce interesant! Și dezarhivarea fișierelor este la fel de ușor?"

„Da. Iată o scurtă descriere a metodelor claselor ZipEntry , ZipInputStream   și ZipOutputStream

" ZipInputStream este un flux, astfel încât toate ZipEntry pot fi citite numai secvenţial. Iată metodele sale:"

Metodă Descriere
ZipEntry getNextEntry() Returnează un obiect care descrie următoarea ZipEntry (omite toți octeții din intrarea curentă).
void closeEntry() Închide fluxul de intrare pe ZipEntry curent (omite toți octeții din intrarea curentă).
int available() Returnează 1, există ZipEntries disponibile, în caz contrar 0.
int read(byte[] b, int off, int len) Citește octeți din ZipEntry curent.
long skip(long n) Omite n octeți când citiți din flux.
void close() Închide fluxul.

— Nu prea înțeleg.

„Cel mai bun lucru de făcut este să vă imaginați că citiți un fișier text, iar ZipEntries sunt ca liniile din fișier. Puteți citi date din linia curentă ( ZipEntry curent) sau puteți sări de la o linie la alta ( getNextEntry , closeEntry ) ."

— Cred că înțeleg, dar nu sunt sigur.

„Iată ZipOutputStream și metodele sale:”

Metodă Descriere
void setComment(String comment) Setează un comentariu asupra arhivei.
void setMethod(int method) Setează metoda de compresie (tip).
void setLevel(int level) Setează nivelul de compresie. Cu cât compresia este mai mare, cu atât merge mai încet.
void putNextEntry(ZipEntry e) Adaugă un nou ZipEntry.
void closeEntry() Închide ZipEntry curent
void write(byte[] b, int off, int len) Scrie un set de octeți în ZipEntry curent.
void close() Închide fluxul.

„Dar în exemplul de mai sus nu am folosit aproape nimic din toate acestea”.

"Acestea sunt metode opționale. Nu trebuie să specificați nivelul și metoda de compresie - vor fi utilizate setările implicite."

"Hmm. Nu e chiar atât de rău. Și ZipEntry?"

"Sigur. Singurele alte informații dintr-un ZipEntry sunt informațiile de menaj:"

Metodă Descriere
String getName(), setName(String) Fișier de nume intern.
long getTime(), setTime(long) Ultima dată, intrarea a fost modificată.
long getCRC(), setCRC(long) Sumă de control.
long getSize(), setSize(long) Dimensiunea înainte de compresie.
int getMethod(), setMethod(int) Metoda de compresie.
long get/setCompressedSize() Mărimea după fermoar.
boolean isDirectory() Este intrarea un director?

"Asta nu pare foarte greu. Ce nu este acolo de iubit!"

„Excelent, atunci Diego îți va da sarcini și pe această temă.”

— Ar fi trebuit să-mi țin gura.