"Cześć, Amigo!"

"Cześć, Ellie!"

„Dzisiaj zajmiemy się strumieniami we/wy”.

„Tak, wiem już o nich wszystko. Używamy tutaj klas FileInputStream i FileOutputStream”.

„Tak, a które metody tych zajęć znasz?”

„Jasne. Oto metody FileInputStream:”

metoda Opis
int read() Odczytuje jeden bajt i zwraca go.
int read(byte b[]) Odczytuje tablicę bajtów i zwraca ją.
int read(byte b[], int off, int len) Odczytuje tablicę bajtów ze strumienia.
long skip(long n) Pomija n bajtów używanych podczas odczytu ze strumienia.
int available() Zwraca liczbę bajtów, które można jeszcze odczytać ze strumienia.
void close() Zamyka strumień.

„Dobrze! A metody FileOutputStream?”

"Spójrz:"

metoda Opis
void write(int b) Zapisuje jeden bajt do strumienia.
void write(byte b[]) Zapisuje tablicę bajtów do strumienia.
void write(byte b[], int off, int len) Zapisuje tablicę bajtów do strumienia.
void close() Zamyka strumień.

- Amigo, zaskakujesz mnie!

"A potem trochę!"

„Dobrze, w takim razie dam ci dwie nowe klasy: ZipInputStream i ZipOutputStream”.

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Czy to jest jak plik zip?"

„Dokładnie. Te strumienie są przeznaczone do pracy z plikami ZIP. Możesz ich użyć do odczytu lub zapisu bezpośrednio do pliku ZIP!”

„Jasna cholera! Jakie to ciekawe. Ale plik ZIP może zawierać nie jeden plik, ale kilka. Jak one działają?”

„W tym celu istnieje inna specjalna klasa: ZipEntry . Przedstawia plik przechowywany w archiwum. Możesz odczytywać obiekty ZipEntry tylko z ZipInputStream , a obiekty ZipEntry możesz zapisywać tylko w ZipOutputStream . Ale okazuje się, że możesz czytać i zapisz do ZipEntry , tak jak zwykły plik”.

– Czy mógłbyś podać mi przykład, jak to działa?

„Oczywiście. Oto przykład, w którym tworzymy archiwum i umieszczamy w nim plik:”

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

„Jakie to interesujące! A rozpakowywanie plików jest równie proste?”

„Tak. Oto krótki opis metod klas ZipEntry , ZipInputStream   i ZipOutputStream

" ZipInputStream to strumień, więc wszystkie ZipEntry można odczytywać tylko sekwencyjnie. Oto jego metody:"

metoda Opis
ZipEntry getNextEntry() Zwraca obiekt opisujący następny ZipEntry (pomija wszystkie bajty w bieżącym wpisie).
void closeEntry() Zamyka strumień wejściowy w bieżącym ZipEntry (pomija wszystkie bajty w bieżącym wpisie).
int available() Zwraca 1 dostępne są ZipEntries, w przeciwnym razie 0.
int read(byte[] b, int off, int len) Odczytuje bajty z bieżącego ZipEntry.
long skip(long n) Pomija n bajtów podczas odczytu ze strumienia.
void close() Zamyka strumień.

„Naprawdę nie rozumiem”.

„Najlepszą rzeczą do zrobienia jest wyobraź sobie, że czytasz plik tekstowy, a ZipEntries są jak linie w pliku. Możesz czytać dane z bieżącej linii (bieżący ZipEntry ) lub przeskakiwać z linii do linii ( getNextEntry , closeEntry ) ”.

– Wydaje mi się, że rozumiem, ale nie jestem pewien.

„Oto ZipOutputStream i jego metody:”

metoda Opis
void setComment(String comment) Ustawia komentarz do archiwum.
void setMethod(int method) Ustawia metodę kompresji (typ).
void setLevel(int level) Ustawia poziom kompresji. Im wyższa kompresja, tym wolniej idzie.
void putNextEntry(ZipEntry e) Dodaje nowy ZipEntry.
void closeEntry() Zamyka bieżący ZipEntry
void write(byte[] b, int off, int len) Zapisuje zestaw bajtów do bieżącego ZipEntry.
void close() Zamyka strumień.

„Ale w powyższym przykładzie prawie nic z tego nie użyliśmy”.

„Są to metody opcjonalne. Nie musisz określać poziomu i metody kompresji — zostaną użyte ustawienia domyślne”.

„Hmm. Nie jest tak źle. A ZipEntry?”

„Jasne. Jedyne inne informacje w ZipEntry to informacje porządkowe:”

metoda Opis
String getName(), setName(String) Plik nazwy wewnętrznej.
long getTime(), setTime(long) Ostatnia modyfikacja wpisu.
long getCRC(), setCRC(long) Suma kontrolna.
long getSize(), setSize(long) Rozmiar przed kompresją.
int getMethod(), setMethod(int) Metoda kompresji.
long get/setCompressedSize() Rozmiar po zapięciu.
boolean isDirectory() Czy wpis jest katalogiem?

„To nie wygląda na bardzo trudne. Czego nie ma do kochania!”

„Wspaniale, w takim razie Diego da ci zadania z tego tematu”.

– Powinienem był trzymać język za zębami.