"Hi, Amigo!"

"Hi, Ellie!"

"Ngayon ay pag-aaralan natin ang mga stream ng I/O."

"Oo, alam ko na ang lahat tungkol sa kanila. Ginagamit namin ang mga klase ng FileInputStream at FileOutputStream dito."

"Oo, at alin sa mga pamamaraan ng klase na ito ang alam mo?"

"Oo naman. Narito ang mga pamamaraan ng FileInputStream:"

Pamamaraan Paglalarawan
int read() Nagbabasa ng isang byte at ibinabalik ito.
int read(byte b[]) Nagbabasa ng byte array at ibinabalik ito.
int read(byte b[], int off, int len) Nagbabasa ng byte array mula sa stream.
long skip(long n) Nilalaktawan ang n byte, ginagamit kapag nagbabasa mula sa stream.
int available() Ibinabalik ang bilang ng mga byte na mababasa pa rin mula sa stream.
void close() Isinasara ang stream.

"Spot on! At ang mga pamamaraan ng FileOutputStream?"

"Tingnan mo:"

Pamamaraan Paglalarawan
void write(int b) Nagsusulat ng isang byte sa stream.
void write(byte b[]) Nagsusulat ng hanay ng mga byte sa stream.
void write(byte b[], int off, int len) Nagsusulat ng hanay ng mga byte sa stream.
void close() Isinasara ang stream.

"Amigo, ginulat mo ako!"

"At pagkatapos ay ilan!"

"Fine, bibigyan kita ng dalawang bagong klase: ZipInputStream at ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Parang zip file ba yan?"

"Eksakto. Ang mga stream na ito ay idinisenyo upang gumana sa mga zip file. Magagamit mo ang mga ito upang magbasa o magsulat nang diretso sa isang zip file!"

"Holy moly! Napakainteresante. Ngunit ang isang zip file ay maaaring magkaroon ng hindi isang file, ngunit marami. Paano gumagana ang mga ito?"

"Para diyan, may isa pang espesyal na klase: ZipEntry . Nagpapakita ito ng file na nakaimbak sa archive. Mababasa mo lang ang mga ZipEntry object mula sa isang ZipInputStream , at maaari mo lang isulat ang mga ZipEntry object sa isang ZipOutputStream . Ngunit lumalabas na nababasa mo at sumulat sa isang ZipEntry tulad ng isang regular na file."

"Maaari mo ba akong bigyan ng halimbawa kung paano ito gumagana?"

"Siyempre. Narito ang isang halimbawa kung saan gumagawa kami ng archive at naglalagay ng file dito:"

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

"Gaano kainteresante! At ang pag-unzip ng mga file ay kasingdali lang?"

"Oo. Narito ang isang maikling paglalarawan ng mga pamamaraan ng mga klase ng ZipEntry , ZipInputStream   at ZipOutputStream "

" Ang ZipInputStream ay isang stream, kaya ang lahat ng ZipEntry ay mababasa lamang nang sunud-sunod. Narito ang mga pamamaraan nito:"

Pamamaraan Paglalarawan
ZipEntry getNextEntry() Ibinabalik ang isang bagay na naglalarawan sa susunod na ZipEntry (nilaktawan ang lahat ng byte sa kasalukuyang entry).
void closeEntry() Isinasara ang input stream sa kasalukuyang ZipEntry (nilaktawan ang lahat ng byte sa kasalukuyang entry).
int available() Ibinabalik ang 1 mayroong ZipEntries na magagamit, kung hindi man ay 0.
int read(byte[] b, int off, int len) Nagbabasa ng mga byte mula sa kasalukuyang ZipEntry.
long skip(long n) Lumalaktaw ang n byte kapag nagbabasa mula sa stream.
void close() Isinasara ang stream.

"Hindi ko talaga maintindihan."

"Ang pinakamagandang gawin ay isipin na nagbabasa ka ng isang text file, at ang ZipEntries ay parang mga linya sa file. Maaari mong basahin ang data mula sa kasalukuyang linya (ang kasalukuyang ZipEntry ) o tumalon mula sa linya patungo sa linya ( getNextEntry , closeEntry ) ."

"Sa tingin ko naiintindihan ko, ngunit hindi ako sigurado."

"Narito ang ZipOutputStream at ang mga pamamaraan nito:"

Pamamaraan Paglalarawan
void setComment(String comment) Nagtatakda ng komento sa archive.
void setMethod(int method) Itinatakda ang paraan ng compression (uri).
void setLevel(int level) Itinatakda ang antas ng compression. Kung mas mataas ang compression, mas mabagal ito.
void putNextEntry(ZipEntry e) Nagdaragdag ng bagong ZipEntry.
void closeEntry() Isinasara ang kasalukuyang ZipEntry
void write(byte[] b, int off, int len) Nagsusulat ng isang hanay ng mga byte sa kasalukuyang ZipEntry.
void close() Isinasara ang stream.

"Ngunit sa halimbawa sa itaas ay halos wala kaming ginamit nito."

"Ito ay mga opsyonal na paraan. Hindi mo kailangang tukuyin ang antas ng compression at paraan—ang mga default na setting ang gagamitin."

"Hmm. Hindi naman masama yun. And ZipEntry?"

"Oo naman. Ang tanging iba pang impormasyon sa isang ZipEntry ay impormasyon sa housekeeping:"

Pamamaraan Paglalarawan
String getName(), setName(String) Panloob na file ng pangalan.
long getTime(), setTime(long) Huling beses na binago ang entry.
long getCRC(), setCRC(long) Checksum.
long getSize(), setSize(long) Sukat bago i-compress.
int getMethod(), setMethod(int) Paraan ng compression.
long get/setCompressedSize() Sukat pagkatapos mag-zip.
boolean isDirectory() Ang entry ba ay isang direktoryo?

"That's not look very hard. What isn't there to love!"

"Magaling, pagkatapos ay bibigyan ka rin ni Diego ng mga gawain sa paksang ito."

"Dapat itinikom ko ang bibig ko."