"Merhaba, Amigo!"

"Merhaba Ellie!"

"Bugün G/Ç akışlarını inceleyeceğiz."

"Evet, onlar hakkında zaten her şeyi biliyorum. Burada FileInputStream ve FileOutputStream sınıflarını kullanıyoruz."

"Evet, peki bu sınıfların hangi yöntemlerini biliyorsun?"

"Elbette. İşte FileInputStream yöntemleri:"

Yöntem Tanım
int read() Bir baytı okur ve döndürür.
int read(byte b[]) Bir bayt dizisini okur ve onu döndürür.
int read(byte b[], int off, int len) Akıştan bir bayt dizisi okur.
long skip(long n) Akıştan okurken kullanılan n baytı atlar.
int available() Akıştan hala okunabilen bayt sayısını döndürür.
void close() Akışı kapatır.

"Dikkat! Ya FileOutputStream yöntemleri?"

"Bir göz at:"

Yöntem Tanım
void write(int b) Akışa bir bayt yazar.
void write(byte b[]) Akışa bir bayt dizisi yazar.
void write(byte b[], int off, int len) Akışa bir bayt dizisi yazar.
void close() Akışı kapatır.

"Amigo, beni şaşırtıyorsun!"

"Ve sonra biraz!"

"Pekala, o zaman sana iki yeni sınıf vereceğim: ZipInputStream ve ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Bu bir zip dosyası gibi mi?"

"Kesinlikle. Bu akışlar zip dosyalarıyla çalışacak şekilde tasarlandı. Bunları doğrudan bir zip dosyasına okumak veya yazmak için kullanabilirsiniz!"

"Vay canına! Ne kadar ilginç. Ama bir zip dosyasında bir değil birden fazla dosya olabilir. Nasıl çalışırlar?"

"Bunun için başka bir özel sınıf var: ZipEntry . Arşivde saklanan bir dosyayı sunar. ZipEntry nesnelerini yalnızca bir ZipInputStream'den okuyabilirsiniz ve ZipEntry nesnelerini yalnızca bir ZipOutputStream'e yazabilirsiniz . normal bir dosya gibi bir ZipEntry'ye yaz ."

"Nasıl çalıştığına dair bir örnek verebilir misin?"

"Elbette. İşte bir arşiv oluşturup içine bir dosya koyduğumuz bir örnek:"

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

"Ne kadar ilginç! Ve dosyaları açmak da bir o kadar kolay mı?"

"Evet. Burada ZipEntry , ZipInputStream   ve ZipOutputStream sınıflarının yöntemlerinin kısa bir açıklaması var "

" ZipInputStream bir akıştır, dolayısıyla tüm ZipEntry yalnızca sırayla okunabilir. İşte yöntemleri:"

Yöntem Tanım
ZipEntry getNextEntry() Sonraki ZipEntry'yi açıklayan bir nesne döndürür (geçerli girişteki tüm baytları atlar).
void closeEntry() Geçerli ZipEntry'deki giriş akışını kapatır (geçerli girdideki tüm baytları atlar).
int available() 1 döndürür, kullanılabilir ZipEntries vardır, aksi takdirde 0.
int read(byte[] b, int off, int len) Geçerli ZipEntry'den bayt okur.
long skip(long n) Akıştan okurken n baytı atlar.
void close() Akışı kapatır.

"Gerçekten anlamıyorum."

"Yapılacak en iyi şey, bir metin dosyası okuduğunuzu ve ZipEntries'in dosyadaki satırlar gibi olduğunu hayal etmektir. Geçerli satırdaki (geçerli ZipEntry ) verileri okuyabilir veya satırdan satıra atlayabilirsiniz ( getNextEntry , closeEntry ) ."

"Anladığımı sanıyorum ama emin değilim."

"İşte ZipOutputStream ve yöntemleri:"

Yöntem Tanım
void setComment(String comment) Arşivde bir yorum ayarlar.
void setMethod(int method) Sıkıştırma yöntemini (türü) ayarlar.
void setLevel(int level) Sıkıştırma seviyesini ayarlar. Sıkıştırma ne kadar yüksek olursa, o kadar yavaş gider.
void putNextEntry(ZipEntry e) Yeni bir ZipEntry ekler.
void closeEntry() Geçerli ZipEntry'yi kapatır
void write(byte[] b, int off, int len) Geçerli ZipEntry'ye bir dizi bayt yazar.
void close() Akışı kapatır.

"Fakat yukarıdaki örnekte bunların neredeyse hiçbirini kullanmadık."

"Bunlar isteğe bağlı yöntemlerdir. Sıkıştırma düzeyi ve yöntemi belirtmeniz gerekmez; varsayılan ayarlar kullanılacaktır."

"Hmm. O kadar da kötü değil. Ya ZipEntry?"

"Elbette. Bir ZipEntry'deki diğer bilgiler yalnızca temizlik bilgileridir:"

Yöntem Tanım
String getName(), setName(String) Dahili ad dosyası.
long getTime(), setTime(long) Giriş en son değiştirildiğinde.
long getCRC(), setCRC(long) Sağlama toplamı.
long getSize(), setSize(long) Sıkıştırmadan önceki boyut.
int getMethod(), setMethod(int) Sıkıştırma yöntemi.
long get/setCompressedSize() Sıkıştırıldıktan sonraki boyut.
boolean isDirectory() Giriş bir dizin mi?

"Bu pek zor görünmüyor. Sevilecek ne var ki!"

"Mükemmel, o zaman Diego sana bu konuda da görevler verecek."

"Çenemi kapalı tutmalıydım."