"हॅलो, अमिगो! आज आपण पुन्हा एकदा InputStream आणि OutputStream कसे काम करतात ते जाणून घेणार आहोत . सुरुवातीचे स्पष्टीकरण थोडेसे सोपे होते. हे इंटरफेस नाहीत. ते अमूर्त वर्ग आहेत आणि त्यांच्याकडे काही पद्धती लागू केल्या आहेत. त्यांच्याकडे असलेल्या पद्धती पाहूया:"

इनपुटस्ट्रीम पद्धती पद्धत काय करते
int read(byte[] buff);
ही पद्धत बफर ( बाइट अ‍ॅरे ) मध्ये बाइट्सचा ब्लॉक ताबडतोब वाचते , जोपर्यंत बफर पूर्ण होत नाही किंवा स्त्रोताकडे वाचण्यासाठी आणखी बाइट्स मिळत नाहीत.
पद्धत प्रत्यक्षात वाचलेल्या बाइट्सची संख्या परत करते (जे अॅरेच्या लांबीपेक्षा कमी असू शकते)
int read();
ही पद्धत एक बाइट वाचते आणि परत करते. परिणाम दिसण्यासाठी int मध्ये रुंद केला जातो. वाचण्यासाठी आणखी बाइट्स नसल्यास, पद्धत -1 परत करते.
int available();
ही पद्धत न वाचलेल्या (उपलब्ध) बाइट्सची संख्या परत करते.
void close();
ही पद्धत प्रवाह "बंद" करते. तुम्ही स्ट्रीमसह काम पूर्ण केल्यावर तुम्ही याला कॉल करता.
ऑब्जेक्ट नंतर फाईल बंद करण्यासाठी आवश्यक असलेली हाउसकीपिंग ऑपरेशन्स इ. करते.
या टप्प्यावर, तुम्ही प्रवाहातील कोणताही डेटा वाचू शकत नाही.

"म्हणून आपण केवळ एकल बाइट्सच नव्हे तर संपूर्ण ब्लॉक्स देखील वाचू शकतो?"

"नक्की."

"आम्ही संपूर्ण ब्लॉक्स देखील लिहू शकतो?"

"होय, ते पहा:"

आउटपुटस्ट्रीम पद्धती पद्धत काय करते
void write(int c);
ही पद्धत एक बाइट लिहिते. इंट प्रकार एका बाइटपर्यंत संकुचित केला आहे. अतिरिक्त भाग फक्त टाकून दिला जातो.
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 (म्हणजे काउंट व्हेरिएबलमध्ये संग्रहित मूल्य).

"आता सर्व काही स्पष्ट झाले आहे. धन्यवाद, एली."