1. InputStreamReaderवर्ग

प्रवाहांचे आणखी एक मनोरंजक वैशिष्ट्य म्हणजे तुम्ही अनेक प्रवाहांना साखळ्यांमध्ये एकत्र करू शकता . प्रवाह केवळ त्याच्या अंतर्गत डेटा स्रोतावरून डेटा वाचू शकत नाही तर दुसर्‍या प्रवाहावरून देखील वाचू शकतो .

Java मधील ही एक अतिशय शक्तिशाली यंत्रणा आहे, ज्यामुळे एका प्रवाहाला दुसऱ्या प्रवाहाशी जोडून जटिल डेटा वाचन परिस्थिती निर्माण करणे शक्य होते. अशी योजना यासारखी दिसते:

InputStreamReader वर्ग

जेव्हा एखादा प्रोग्राम डेटा प्रवाहातील डेटा वाचतो, तेव्हा डेटा प्रवाह त्याच्या डेटा स्रोतातील डेटा वाचतो, उदाहरणार्थ, दुसरा डेटा प्रवाह किंवा फाइल.

इतकेच काय, प्रत्येक डेटा प्रवाह केवळ डेटा वाचतो आणि देतो असे नाही तर त्याचे रूपांतर देखील करू शकतो किंवा त्यावर विविध ऑपरेशन्स करू शकतो. अशा "मध्यवर्ती प्रवाह" चे उत्तम उदाहरण म्हणजे InputStreamReaderवर्ग.

आम्हांला आधीच नावाचा वर्ग माहीत आहे FileReader- तो Readerफाईलमधील डेटा वाचतो. आणि InputStreamReaderत्याचा डेटा कुठून मिळतो? ते बरोबर आहे — पासून InputStream.

जेव्हा तुम्ही एखादी वस्तू तयार करता , तेव्हा तुम्हाला एखादी वस्तू किंवा त्याच्या वंशज वर्गात InputStreamReaderउत्तीर्ण होणे आवश्यक असते . InputStreamउदाहरण:

String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);

वर्गाकडे असलेल्या InputStreamReaderसर्व पद्धती आहेत Readerआणि त्या अगदी त्याच पद्धतीने कार्य करतात.

InputStreamReaderवर्ग आणि म्हणा, FileReaderते कुठून डेटा वाचतात हा मुख्य फरक आहे. FileReaderफाईलमधील डेटा वाचतो (duh — म्हणूनच त्याला म्हणतात FileReader), परंतु InputStreamReaderवरून डेटा वाचतो InputStream.

FileReaderजेव्हा तुम्ही मेथड वापरून ऑब्जेक्टमधील एखादे कॅरेक्टर वाचता read(), तेव्हा ते डिस्कवरील फाईलमधील दोन बाइट्स वाचते आणि त्यांना म्हणून परत करते chars.

InputStreamReaderजेव्हा तुम्ही मेथड वापरून ऑब्जेक्टमधील एखादे कॅरेक्टर वाचता read(), तेव्हा ते त्याकडे दिलेल्या ऑब्जेक्टचे दोन बाइट्स वाचते FileInputStream, ज्यामुळे फाइलमधील डेटा वाचतो. याचा परिणाम म्हणजे कॉल्स टू read()मेथड्सची साखळी.


2. BufferedReaderवर्ग

आणखी एक मनोरंजक वर्ग जो तुम्हाला खूप वापरण्याची शक्यता आहे BufferedReader. हा देखील एक "मध्यवर्ती प्रवाह" आहे जो दुसर्‍या प्रवाहातील डेटा वाचतो.

त्याच्या नावाप्रमाणे, BufferedReaderवर्ग हा उपवर्ग आहे Readerआणि तुम्हाला वर्ण वाचू देतो . परंतु सर्वात मनोरंजक गोष्ट अशी आहे की आपल्याला त्यास एका प्रवाहाच्या रूपात डेटा स्रोत पास करणे आवश्यक आहे ज्यामधून वर्ण वाचले जाऊ शकतात , म्हणजे वर्गाचा वारसा मिळालेला प्रवाह Reader.

मुद्दा काय आहे? विपरीत InputStreamReader, BufferedReaderवर्ग बाइट्सला वर्णांमध्ये रूपांतरित करत नाही: ते काहीही रूपांतरित करत नाही. त्याऐवजी, ते डेटा बफर करते .

जेव्हा एखादा प्रोग्राम ऑब्जेक्टमधून एकच वर्ण वाचतो BufferedReader, तेव्हा ऑब्जेक्ट त्याच्या स्त्रोत प्रवाहातील वर्णांची एक मोठी अॅरे एकाच वेळी वाचते. आणि ते आंतरिकरित्या संग्रहित करते.

जेव्हा ऑब्जेक्टमधून पुढील कॅरेक्टर वाचले जाते BufferedReader, तेव्हा ते फक्त त्याच्या अंतर्गत बफर अॅरेमधून पुढील कॅरेक्टर पकडते आणि डेटा स्त्रोतामध्ये प्रवेश न करता ते परत करते. जेव्हा बफरमधील सर्व वर्ण वापरले जातात तेव्हाच ते वर्णांच्या दुसर्‍या मोठ्या अॅरेमध्ये वाचले जाते.

क्लासमध्ये BufferedReaderएक अतिशय उपयुक्त पद्धत देखील आहे — String readLine(), जी तुम्हाला स्त्रोत प्रवाहातील डेटाच्या संपूर्ण स्ट्रिंग्स एकाच वेळी वाचू देते. तुम्ही ही पद्धत वापरू शकता, म्हणा, फाइल वाचण्यासाठी आणि त्यातील मजकूर स्क्रीनवर ओळीनुसार प्रदर्शित करू शकता. उदाहरण:

हे किती सोयीचे असू शकते हे स्पष्ट करण्यासाठी आम्ही विशेषतः काही संक्षिप्त कोड लिहिले. हा कोड थोडा अधिक तपशीलाने देखील लिहिला जाऊ शकतो.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
एक FileReaderऑब्जेक्ट तयार करा. डेटा स्रोत एक फाइल आहे.
एक BufferedReaderऑब्जेक्ट तयार करा. डेटा स्रोत एक आहे FileReader.
जोपर्यंत रीडरमध्ये डेटा आहे तोपर्यंत
एक ओळ वाचा
ओळ प्रदर्शित करा
एक महत्त्वाचा मुद्दा:

तुम्ही अनेक प्रवाह एकत्र जोडल्यास, पद्धत close()फक्त त्यापैकी एकावर कॉल करणे आवश्यक आहे. close()अंतिम डेटा स्ट्रीमवर कॉल करेपर्यंत तो प्रवाह त्याच्या डेटा स्रोतावरील पद्धतीला कॉल करेल आणि असेच पुढे .



3. कन्सोलमधून वाचन

आणि आणखी एक मनोरंजक वस्तुस्थिती: Scannerवर्ग हा एक इंटरमीडिएट इनपुट प्रवाहापेक्षा अधिक काही नाही जो वरून डेटा वाचतो System.in, जो डेटा प्रवाह देखील आहे.

कन्सोलमधून ओळ वाचण्याचे दोन मार्ग येथे आहेत:

स्कॅनर वर्ग BufferedReader आणि BufferedWriter वर्ग
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

आमचा मित्र वर्गाच्या स्थिर व्हेरिएबलपेक्षा अधिक काही नाही . हे कोणाचे नाव आहे .System.ininSystemInputStreamin

त्यामुळे CodeGym वरील तुमच्या Java अभ्यासाच्या अगदी सुरुवातीपासूनच तुम्ही डेटा प्रवाहांवर काम करत आहात आणि त्यांच्यापासून साखळी तयार करत आहात. पण आता तुम्ही ते अधिक जाणीवपूर्वक कराल.