"हाय, अमीगो!"

"हाय, ऐली!"

"आज हम I/O धाराओं का अध्ययन करने जा रहे हैं।"

"हाँ, मैं पहले से ही उनके बारे में सब कुछ जानता हूँ। हम यहाँ FileInputStream और FileOutputStream कक्षाओं का उपयोग करते हैं।"

"हाँ, और इनमें से किस वर्ग के तरीके आप जानते हैं?"

"ज़रूर। यहाँ FileInputStream के तरीके हैं:"

तरीका विवरण
int read() एक बाइट पढ़ता है और उसे वापस कर देता है।
int read(byte b[]) एक बाइट सरणी पढ़ता है और इसे वापस करता है।
int read(byte b[], int off, int len) धारा से एक बाइट सरणी पढ़ता है।
long skip(long n) स्किप एन बाइट्स, स्ट्रीम से पढ़ते समय उपयोग किया जाता है।
int available() बाइट्स की संख्या लौटाता है जिसे अभी भी स्ट्रीम से पढ़ा जा सकता है।
void close() धारा बंद कर देता है।

"स्पॉट ऑन! और FileOutputStream के तरीके?"

"नज़र रखना:"

तरीका विवरण
void write(int b) धारा को एक बाइट लिखता है।
void write(byte b[]) स्ट्रीम में बाइट्स की एक सरणी लिखता है।
void write(byte b[], int off, int len) स्ट्रीम में बाइट्स की एक सरणी लिखता है।
void close() धारा बंद कर देता है।

"अमीगो, तुमने मुझे चौंका दिया!"

"और फिर कुछ!"

"ठीक है, तो मैं आपको दो नई कक्षाएं दूंगा: ZipInputStream और ZipOutputStream।"

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" ज़िप ? क्या वह ज़िप फ़ाइल की तरह है?"

"बिल्कुल सही। इन धाराओं को ज़िप फ़ाइलों के साथ काम करने के लिए डिज़ाइन किया गया है। आप इन्हें सीधे ज़िप फ़ाइल में पढ़ने या लिखने के लिए उपयोग कर सकते हैं!"

"पवित्र मोली! कितना दिलचस्प है। लेकिन एक ज़िप फ़ाइल में एक नहीं, बल्कि कई फाइलें हो सकती हैं। वे कैसे काम करती हैं?"

"उसके लिए, एक और विशेष वर्ग है: ZipEntry । यह संग्रह में संग्रहीत फ़ाइल प्रस्तुत करता है। आप केवल ZipInputStream से ZipEntry ऑब्जेक्ट पढ़ सकते हैं, और आप केवल ZipEntry ऑब्जेक्ट को ZipOutputStream पर लिख सकते हैं । लेकिन यह पता चला है कि आप पढ़ सकते हैं और ZipEntry को एक नियमित फ़ाइल की तरह लिखें ।"

"क्या आप मुझे इसका उदाहरण दे सकते हैं कि यह कैसे काम करता है?"

"बिल्कुल। यहाँ एक उदाहरण है जहाँ हम एक संग्रह बनाते हैं और उसमें एक फ़ाइल डालते हैं:"

कोड
// 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();

"कितना रोचक! और फ़ाइलों को खोलना उतना ही आसान है?"

"हाँ। यहाँ ZipEntry , ZipInputStream   और ZipOutputStream क्लासेस के तरीकों का संक्षिप्त विवरण दिया गया है "

" ZipInputStream एक स्ट्रीम है, इसलिए सभी ZipEntry को केवल क्रमिक रूप से पढ़ा जा सकता है। यहाँ इसकी विधियाँ हैं:"

तरीका विवरण
ZipEntry getNextEntry() अगले ZipEntry का वर्णन करने वाली वस्तु लौटाता है (वर्तमान प्रविष्टि में सभी बाइट्स को छोड़ देता है)।
void closeEntry() वर्तमान ZipEntry पर इनपुट स्ट्रीम बंद करता है (वर्तमान प्रविष्टि में सभी बाइट्स छोड़ देता है)।
int available() रिटर्न 1 में ZipEntries उपलब्ध हैं, अन्यथा 0।
int read(byte[] b, int off, int len) वर्तमान ZipEntry से बाइट पढ़ता है।
long skip(long n) स्ट्रीम से पढ़ते समय एन बाइट छोड़ देता है।
void close() धारा बंद कर देता है।

"मैं वास्तव में नहीं समझता।"

"सबसे अच्छी बात यह कल्पना करना है कि आप एक पाठ फ़ाइल पढ़ रहे हैं, और ZipEntries फ़ाइल में लाइनों की तरह हैं। आप वर्तमान लाइन (वर्तमान ZipEntry) से डेटा पढ़ सकते हैं या लाइन से लाइन पर जा सकते हैं ( getNextEntry , closeEntry ) "

"मुझे लगता है कि मैं समझता हूं, लेकिन मुझे यकीन नहीं है।"

"यहाँ ZipOutputStream और इसके तरीके हैं:"

तरीका विवरण
void setComment(String comment) संग्रह पर एक टिप्पणी सेट करता है।
void setMethod(int method) संपीड़न विधि (प्रकार) सेट करता है।
void setLevel(int level) संपीड़न स्तर सेट करता है। संपीड़न जितना अधिक होगा, उतना ही धीमा होगा।
void putNextEntry(ZipEntry e) एक नया ZipEntry जोड़ता है।
void closeEntry() वर्तमान ZipEntry को बंद करता है
void write(byte[] b, int off, int len) वर्तमान ZipEntry में बाइट्स का एक सेट लिखता है।
void close() धारा बंद कर देता है।

"लेकिन ऊपर के उदाहरण में हमने इसका लगभग कोई भी उपयोग नहीं किया है।"

"ये वैकल्पिक तरीके हैं। आपको संपीड़न स्तर और विधि निर्दिष्ट करने की आवश्यकता नहीं है - डिफ़ॉल्ट सेटिंग्स का उपयोग किया जाएगा।"

"हम्म। यह इतना बुरा नहीं है। और ZipEntry?"

"बिल्कुल। ZipEntry में केवल अन्य जानकारी हाउसकीपिंग जानकारी है:"

तरीका विवरण
String getName(), setName(String) आंतरिक नाम फ़ाइल।
long getTime(), setTime(long) पिछली बार प्रविष्टि संशोधित की गई थी।
long getCRC(), setCRC(long) चेकसम।
long getSize(), setSize(long) संपीड़न से पहले आकार।
int getMethod(), setMethod(int) संपीड़न विधि।
long get/setCompressedSize() ज़िप करने के बाद आकार।
boolean isDirectory() क्या प्रविष्टि एक निर्देशिका है?

"यह बहुत कठिन नहीं लगता। प्यार करने के लिए क्या नहीं है!"

"बहुत बढ़िया, फिर डिएगो आपको इस विषय पर टास्क भी देगा।"

"मुझे अपना मुंह बंद रखना चाहिए था।"