"Hai, Amigo!"

"Hai, Ellie!"

"Hari ini kita akan mengkaji aliran I/O."

"Ya, saya sudah tahu segala-galanya tentang mereka. Kami menggunakan kelas FileInputStream dan FileOutputStream di sini."

"Ya, dan kaedah kelas ini yang manakah anda tahu?"

"Tentu. Berikut ialah kaedah FileInputStream:"

Kaedah Penerangan
int read() Membaca satu bait dan mengembalikannya.
int read(byte b[]) Membaca tatasusunan bait dan mengembalikannya.
int read(byte b[], int off, int len) Membaca tatasusunan bait daripada strim.
long skip(long n) Melangkau n bait, digunakan semasa membaca daripada strim.
int available() Mengembalikan bilangan bait yang masih boleh dibaca daripada strim.
void close() Menutup strim.

"Spot on! Dan kaedah FileOutputStream?"

"Tengoklah:"

Kaedah Penerangan
void write(int b) Menulis satu bait ke strim.
void write(byte b[]) Menulis tatasusunan bait ke strim.
void write(byte b[], int off, int len) Menulis tatasusunan bait ke strim.
void close() Menutup strim.

"Amigo, awak kejutkan saya!"

"Dan kemudian beberapa!"

"Baiklah, kemudian saya akan memberi anda dua kelas baharu: ZipInputStream dan ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Adakah itu seperti fail zip?"

"Tepat sekali. Strim ini direka bentuk untuk berfungsi dengan fail zip. Anda boleh menggunakannya untuk membaca atau menulis terus ke fail zip!"

"Holy moly! Sungguh menarik. Tetapi fail zip tidak boleh mempunyai satu fail, tetapi beberapa. Bagaimana ia berfungsi?"

"Untuk itu, terdapat satu lagi kelas khas: ZipEntry . Ia membentangkan fail yang disimpan dalam arkib. Anda hanya boleh membaca objek ZipEntry daripada ZipInputStream , dan anda hanya boleh menulis objek ZipEntry ke ZipOutputStream . Tetapi ternyata anda boleh membaca dan tulis ke ZipEntry sama seperti fail biasa."

"Bolehkah anda memberi saya contoh cara ia berfungsi?"

"Sudah tentu. Berikut ialah contoh di mana kami mencipta arkib dan meletakkan fail di dalamnya:"

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

"Sungguh menarik! Dan membuka zip fail adalah sama mudah?"

"Ya. Berikut ialah penerangan ringkas tentang kaedah kelas ZipEntry , ZipInputStream   dan ZipOutputStream "

" ZipInputStream ialah strim, jadi semua ZipEntry hanya boleh dibaca secara berurutan. Berikut ialah kaedahnya:"

Kaedah Penerangan
ZipEntry getNextEntry() Mengembalikan objek yang menerangkan ZipEntry seterusnya (melangkau semua bait dalam entri semasa).
void closeEntry() Menutup aliran input pada ZipEntry semasa (melangkau semua bait dalam entri semasa).
int available() Mengembalikan 1 terdapat ZipEntries tersedia, jika tidak 0.
int read(byte[] b, int off, int len) Membaca bait daripada ZipEntry semasa.
long skip(long n) Melangkau n bait apabila membaca daripada strim.
void close() Menutup strim.

"Saya tidak begitu faham."

"Perkara terbaik untuk dilakukan ialah bayangkan anda sedang membaca fail teks dan ZipEntries adalah seperti baris dalam fail. Anda boleh membaca data dari baris semasa ( ZipEntry semasa ) atau melompat dari baris ke baris ( getNextEntry , closeEntry ) ."

"Saya rasa saya faham, tetapi saya tidak pasti."

"Inilah ZipOutputStream dan kaedahnya:"

Kaedah Penerangan
void setComment(String comment) Menetapkan ulasan pada arkib.
void setMethod(int method) Menetapkan kaedah mampatan (jenis).
void setLevel(int level) Menetapkan tahap mampatan. Semakin tinggi pemampatan, semakin perlahan ia berjalan.
void putNextEntry(ZipEntry e) Menambah ZipEntry baharu.
void closeEntry() Menutup ZipEntry semasa
void write(byte[] b, int off, int len) Menulis satu set bait ke ZipEntry semasa.
void close() Menutup strim.

"Tetapi dalam contoh di atas kami hampir tidak menggunakan semua ini."

"Ini adalah kaedah pilihan. Anda tidak perlu menentukan tahap dan kaedah mampatan—tetapan lalai akan digunakan."

"Hmm. Itu tidak begitu teruk. Dan ZipEntry?"

"Tentu. Satu-satunya maklumat lain dalam ZipEntry ialah maklumat pengemasan:"

Kaedah Penerangan
String getName(), setName(String) Fail nama dalaman.
long getTime(), setTime(long) Kali terakhir entri itu diubah suai.
long getCRC(), setCRC(long) Checksum.
long getSize(), setSize(long) Saiz sebelum pemampatan.
int getMethod(), setMethod(int) Kaedah pemampatan.
long get/setCompressedSize() Saiz selepas zip.
boolean isDirectory() Adakah entri itu direktori?

"Itu tidak kelihatan sangat sukar. Apa yang tidak ada untuk mencintai!"

"Cemerlang, maka Diego akan memberi anda tugasan mengenai topik ini juga."

"Saya sepatutnya menutup mulut saya."