"नमस्कार, अमीगो! आज हम एक बार फिर से इस बात की खोज करने जा रहे हैं कि इनपुटस्ट्रीम और आउटपुटस्ट्रीम कैसे काम करते हैं। प्रारंभिक व्याख्या वास्तव में थोड़ी सरल थी। ये इंटरफेस नहीं हैं। वे अमूर्त वर्ग हैं, और यहां तक ​​कि उनके पास कुछ कार्यान्वित तरीके भी हैं। आइए एक नज़र डालते हैं कि उनके पास क्या तरीके हैं:"

इनपुटस्ट्रीम के तरीके विधि क्या करती है
int read(byte[] buff);
यह विधि तुरंत बाइट्स के एक ब्लॉक को बफर ( बाइट सरणी ) में पढ़ती है, जब तक कि बफर भर नहीं जाता है या जब तक स्रोत में पढ़ने के लिए और बाइट्स नहीं होते हैं।
विधि वास्तव में पढ़ी गई बाइट्स की संख्या लौटाती है (जो सरणी की लंबाई से कम हो सकती है)
int read();
यह विधि एक बाइट पढ़ती है और उसे वापस कर देती है। परिणाम दिखने के लिए int तक विस्तृत है। यदि पढ़ने के लिए और बाइट नहीं हैं, तो विधि -1 लौटाती है।
int available();
यह विधि अपठित (उपलब्ध) बाइट्स की संख्या लौटाती है।
void close();
यह विधि धारा को "बंद" करती है। आप इसे तब कहते हैं जब आप स्ट्रीम के साथ काम करना समाप्त कर लेते हैं।
ऑब्जेक्ट तब फ़ाइल आदि को बंद करने के लिए आवश्यक हाउसकीपिंग संचालन करता है।
इस बिंदु पर, आप स्ट्रीम से और डेटा नहीं पढ़ सकते हैं।

"तो हम न केवल एक बाइट पढ़ सकते हैं, बल्कि पूरे ब्लॉक भी पढ़ सकते हैं?"

"बिल्कुल।"

"क्या हम पूरे ब्लॉक भी लिख सकते हैं?"

"हाँ, इसे देखें:"

आउटपुटस्ट्रीम के तरीके विधि क्या करती है
void write(int c);
यह विधि एक बाइट लिखती है। Int प्रकार एक बाइट तक सीमित है। अतिरिक्त भाग को बस त्याग दिया जाता है।
void write(byte[] buff);
यह विधि बाइट्स का एक ब्लॉक लिखती है।
void write(byte[] buff, int from, int count);
यह विधि बाइट्स के ब्लॉक का हिस्सा लिखती है। इसका उपयोग उन मामलों में किया जाता है जब बाइट सरणी पूरी तरह से भरी नहीं हो सकती है।
void flush();
यदि स्ट्रीम आंतरिक रूप से कोई डेटा संग्रहीत कर रही है जो अभी तक लिखा नहीं गया है, तो यह विधि इसे लिखने के लिए बाध्य करती है।
void close();
यह विधि धारा को "बंद" करती है। आप इसे तब कहते हैं जब आप स्ट्रीम के साथ काम करना समाप्त कर लेते हैं।
ऑब्जेक्ट तब फ़ाइल को बंद करने के लिए आवश्यक हाउसकीपिंग संचालन करता है, आदि। अब आप डेटा को स्ट्रीम में नहीं लिख सकते हैं, और फ़्लश को स्वचालित रूप से कॉल किया जाता है।

"अगर हम सिंगल बाइट्स के बजाय एक बार में पूरे ब्लॉक पढ़ते हैं तो फाइल कॉपी करने वाला कोड कैसा दिखेगा?"

"हम्म। कुछ इस तरह:"

डिस्क पर फ़ाइल कॉपी करें
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"मैं बफर के बारे में सबकुछ समझता हूं, लेकिन यह गिनती चर क्या है?"

"जब हम किसी फ़ाइल से डेटा के नवीनतम ब्लॉक को पढ़ते हैं, तो हमें 1000 के बजाय 328 बाइट्स मिल सकते हैं। इसलिए जब हम डेटा लिखते हैं, तो हमें यह इंगित करने की आवश्यकता होती है कि हम पूरे ब्लॉक को नहीं लिख रहे हैं - केवल पहले 328 बाइट्स।"

जब हम अंतिम ब्लॉक पढ़ते हैं, तो रीड विधि वास्तव में पढ़ी गई बाइट्स की संख्या वापस कर देगी। 1000 हर बार हम एक ब्लॉक पढ़ते हैं, अंतिम ब्लॉक को छोड़कर, जब हमें 328 मिलते हैं।

इसलिए जब हम एक ब्लॉक लिखते हैं, तो हम संकेत देते हैं कि बफर में सभी बाइट्स नहीं लिखे जाने चाहिए, केवल 328 (यानी गिनती चर में संग्रहीत मान)।

"अब यह सब स्पष्ट है। धन्यवाद, ऐली।"