1. 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एक फ़ाइल से डेटा पढ़ता है (डुह - इसीलिए इसे कहा जाता है 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 पर आपके जावा अध्ययन की शुरुआत से ही, आप डेटा स्ट्रीम के साथ काम कर रहे हैं और उनसे श्रृंखलाएँ बना रहे हैं। लेकिन अब आप इसे और होशपूर्वक करेंगे।