CodeGym /Java Blog /अनियमित /कीबोर्ड से पढ़ना: "पाठक"
John Squirrels
स्तर 41
San Francisco

कीबोर्ड से पढ़ना: "पाठक"

अनियमित ग्रुप में प्रकाशित
नमस्ते! स्तर 3 के पाठ और कार्य आपको सिखाते हैं कि कंसोल पर सामग्री कैसे प्रदर्शित करें, और दूसरी दिशा में चलते हुए, कीबोर्ड से डेटा कैसे पढ़ें।
कीबोर्ड से पढ़ना: "रीडर्स" - 1
आपने इसे पूरा करने के लिए निम्नलिखित जटिल निर्माण का उपयोग करना भी सीखा:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
लेकिन एक सवाल है जिसका हमने अभी तक जवाब नहीं दिया है।

दुनिया में यह कैसे काम करता है?

हकीकत में, कार्यक्रम शायद ही कभी पूरी तरह से स्वतंत्र होते हैं। वे अन्य कार्यक्रमों, प्रणालियों, इंटरनेट आदि के साथ संवाद करते हैं। "संवाद" से हमारा मुख्य अर्थ "डेटा का आदान-प्रदान" है। यानी वे कुछ बाहरी डेटा प्राप्त करते हैं और कहीं आंतरिक प्रोग्राम डेटा भी भेजते हैं। रोज़मर्रा की ज़िंदगी में डेटा के आदान-प्रदान के कार्यक्रमों के उदाहरण प्रचुर मात्रा में हैं। उदाहरण के लिए, कई वेबसाइट आपको पंजीकरण करने के बजाय अपने Facebook या Twitter खाते का उपयोग करके साइन इन करने देती हैं। इस स्थिति में, दो प्रोग्राम (जैसे कि Twitter और जिस वेबसाइट पर आप साइन इन कर रहे हैं) आवश्यक डेटा का आदान-प्रदान करते हैं। अंतिम परिणाम यह है कि आपने सफलतापूर्वक साइन इन कर लिया है। शब्द "स्ट्रीम"डेटा विनिमय की प्रक्रिया का वर्णन करने के लिए प्रयोग किया जाता है। यह नाम कहां से आया? आपके अनुभव में, एक "धारा" नदियों से और प्रोग्रामिंग से अधिक जुड़ी हो सकती है। यह कोई दुर्घटना नहीं है :) एक धारा, संक्षेप में, डेटा का एक चलता-फिरता टुकड़ा है। दूसरे शब्दों में, प्रोग्रामिंग में, यह पानी नहीं है जो बहता है - बल्कि बाइट्स और वर्णों के रूप में डेटा। हम डेटा स्ट्रीम से बिट डेटा प्राप्त कर सकते हैं और फिर उनका उपयोग कर सकते हैं। फिर से, हम पानी/प्रवाह सादृश्य का उपयोग करेंगे: आप सूप बनाने, आग बुझाने, या अपने फूलों को पानी देने के लिए नदी से पानी निकाल सकते हैं। स्ट्रीम आपको किसी भी डेटा स्रोत के साथ काम करने देती हैं: चाहे इंटरनेट, आपके कंप्यूटर का फ़ाइल सिस्टम, या कुछ और - इससे कोई फर्क नहीं पड़ता। धाराएँ एक सार्वभौमिक उपकरण हैं। वे एक प्रोग्राम को कहीं से भी डेटा प्राप्त करने की अनुमति देते हैं (इनपुट स्ट्रीम) और इसे कहीं भी (आउटपुट स्ट्रीम) भेजते हैं। उनका काम एक ही है: एक जगह से डेटा लेना और उसे दूसरी जगह भेजना। धाराएँ दो प्रकार की होती हैं:
  1. डेटा प्राप्त करने के लिए इनपुट स्ट्रीम का उपयोग किया जाता है
  2. आउटपुट स्ट्रीम डेटा भेजने के लिए हैं।
जावा में, इन धाराओं को InputStreamऔर OutputStreamकक्षाओं द्वारा कार्यान्वित किया जाता है। लेकिन धाराओं को दूसरे तरीके से वर्गीकृत किया जा सकता है। इनपुट और आउटपुट स्ट्रीम के अलावा, हम बाइट स्ट्रीम और कैरेक्टर स्ट्रीम के बारे में भी बात करते हैं । यहाँ अर्थ पर्याप्त स्पष्ट होना चाहिए: बाइट स्ट्रीम बाइट्स के सेट के रूप में सूचना भेजती है, जबकि एक वर्ण धारा इसे वर्णों के सेट के रूप में भेजती है। इस पाठ में, हम इनपुट स्ट्रीम पर ध्यान केन्द्रित करेंगे। मैं पाठ के अंत में आउटपुट स्ट्रीम के बारे में जानकारी के साथ एक लिंक डालूँगा। आप इसे अपने आप पढ़ सकते हैं :) अब इस कोड को देखें:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
जब आप पाठों को पढ़ रहे थे, तो क्या आपको नहीं लगा कि यह पंक्ति काफी डराने वाली थी? :) एक बार जब हम यह पता लगा लेंगे कि यह कैसे काम करता है तो ऐसा नहीं होगा। आइए चीजों को ठीक करें। हम अंत में शुरू करेंगे। System.inएक InputStreamवस्तु है, उस कक्षा का एक उदाहरण जिसके बारे में हमने पहले बात की थी। यह एक इनपुट स्ट्रीम है जो सिस्टम इनपुट डिवाइस (कीबोर्ड) से जुड़ी होती है। वैसे, आप अप्रत्यक्ष रूप से इस धारा से परिचित हैं। आखिरकार, आप अक्सर इसके "सहकर्मी" का उपयोग करते हैं - System.out! System.outसिस्टम आउटपुट स्ट्रीम है। इसका उपयोग आपकी पसंदीदा विधि के माध्यम से कंसोल में डेटा आउटपुट करने के लिए किया जाता है System.out.println(), जिसका आप लगातार उपयोग करते हैं :) System.outकंसोल में डेटा भेजने के लिए एक स्ट्रीम है, जबकिSystem.inकीबोर्ड से डेटा प्राप्त करने के लिए है। यह सब सरल है :) और तो और, हम इस विशाल निर्माण के बिना कीबोर्ड से डेटा पढ़ सकते हैं। हम बस लिख सकते हैं : System.in.read();

public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
कक्षा InputStream(याद रखें, System.inएक InputStreamवस्तु है) में एक read()विधि है जो आपको डेटा पढ़ने देती है। एक समस्या है: यह बाइट्स पढ़ता है , अक्षर नहीं । केवल अंग्रेजी अक्षरों का उपयोग करना उबाऊ है, इसलिए आइए कीबोर्ड से चीनी वर्ण "魚" को पढ़ने का प्रयास करें (बस इस पत्र को यहां से कॉपी करें और पीसी पर ctrl + v या मैक पर कमांड + v का उपयोग करके कंसोल में पेस्ट करें ) । वैसे इस कैरेक्टर का मतलब होता है 'एक मछली'। कंसोल आउटपुट: 233 173 154 10 यह प्रतीक और कई अन्य चीनी कंप्यूटर की स्मृति में 3 बाइट्स पर कब्जा कर लेते हैं (लैटिन अक्षरों के विपरीत, जो सिर्फ 1 बाइट पर कब्जा करते हैं)। इस मामले में, स्ट्रीम से 4 बाइट पढ़े जाते हैं: पहले तीन वर्ण "魚" का प्रतिनिधित्व करते हैं, और अन्य बाइट एक नई लाइन (एंटर) का प्रतिनिधित्व करते हैं। तदनुसार, System.inइसके अनावृत रूप में हमारे लिए कोई विकल्प नहीं है। मनुष्य (दुर्लभ अपवादों के साथ!) बाइट्स पढ़ना नहीं जानते। लेकिन InputStreamReaderवर्ग बचाव के लिए आता है! आइए देखें कि यह किस प्रकार का जानवर है।

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
हम InputStreamReaderSystem.in ऑब्जेक्ट को पास करते हैं । वर्ग का नाम यह कहता है! हम एक वस्तु बनाते हैं और इसे एक इनपुट स्ट्रीम पास करते हैं जिससे यह डेटा पढ़ेगा। इस मामले में... InputStreamReader

new InputStreamReader(System.in)
... हम इसे बताते हैं, "आप सिस्टम इनपुट स्ट्रीम (कीबोर्ड से) से डेटा पढ़ेंगे"। लेकिन यह इसका एकमात्र कार्य नहीं है! InputStreamReaderस्ट्रीम से न केवल डेटा प्राप्त होता है । यह बाइट स्ट्रीम को कैरेक्टर स्ट्रीम में भी परिवर्तित करता है । दूसरे शब्दों में, अब आपको डेटा को "एक और शून्य" से "मानव-पठनीय भाषा" में बदलने की आवश्यकता नहीं है। InputStreamreaderतुम्हारे लिए सब कुछ करता है। बेशक, InputStreamReaderकंसोल से डेटा पढ़ने तक ही सीमित नहीं है। यह अन्य जगहों के डेटा को भी पढ़ सकता है। उदाहरण के लिए, एक फ़ाइल से:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
यहां हम एक FileInputStream(एक स्वाद InputStream) बनाते हैं, फ़ाइल पथ में पास करते हैं, और स्ट्रीम को ही पास करते हैं InputStreamReader। अब यह फ़ाइल से डेटा पढ़ने में सक्षम होगा (यदि फ़ाइल वास्तव में पथ पर मौजूद है)। हम डेटा पढ़ने के लिए InputStreamReaderकक्षा की read()विधि का भी उपयोग करते हैं (डेटा का स्रोत कोई फर्क नहीं पड़ता: कंसोल, फ़ाइल, या कहीं और)। System.in.read()और के बीच क्या अंतर है InputStreamReader.read()? InputStreamReaderमैं आपको याद दिलाता हूं कि वास्तव में इसके द्वारा क्या पढ़ा गया था System.in.read(): 233 173 154 10 और InputStreamReaderवही काम कैसे करता है?

public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
कंसोल आउटपुट: 39770 10 अंतर तुरंत स्पष्ट है। अंतिम बाइट (नई पंक्ति का प्रतिनिधित्व) अपरिवर्तित बनी हुई है (संख्या 10), लेकिन वर्ण "魚" को एकल कोड "39770" में परिवर्तित कर दिया गया था। वर्णों को पढ़ने का यही अर्थ है! यदि आपको विश्वास नहीं है कि 39770 "魚" अक्षर का प्रतिनिधित्व करता है, तो अपने आप को समझाना आसान है :)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 39770;
       System.out.println(x);
   }
}
कंसोल आउटपुट: लेकिन अगर InputStreamReaderइतना बढ़िया है, तो हमें इसकी भी आवश्यकता क्यों है BufferedReader? InputStreamReaderजानता है कि डेटा को कैसे पढ़ना है और बाइट्स को वर्णों में बदलना है। हम और किसके लिए कह सकते हैं? दूसरा पाठक क्यों? :/ उत्तर बहुत सरल है: बेहतर प्रदर्शन और सुविधा के लिए । चलिए प्रदर्शन से शुरू करते हैं। डेटा पढ़ते समय BufferedReader, यह एक विशेष क्षेत्र का उपयोग करता है जिसे बफर कहा जाता है, जहां यह पढ़ने वाले वर्णों को "संग्रहित" करता है। अंततः, जब इन पात्रों की कार्यक्रम में आवश्यकता होती है, तो उन्हें बफर से लिया जाएगा, न कि सीधे डेटा स्रोत (कीबोर्ड, फ़ाइल, आदि) से। इससे बहुत सारे संसाधनों की बचत होती है। यह कैसे काम करता है यह समझने के लिए, एक बड़ी कंपनी में एक कूरियर की कल्पना करें। कूरियर एक कार्यालय में बैठता है, डिलीवरी के लिए पैकेज लाने के लिए किसी का इंतजार करता है। हर बार जब उसे एक नया पैकेज मिलता है, तो वह तुरंत सड़क पर उतर सकता है। लेकिन दिन के दौरान बहुत सारे पैकेज हो सकते हैं। उसे कार्यालय और वितरण पतों के बीच बहुत सारी यात्राएँ करनी होंगी। इसके बजाय, कूरियर अपने कार्यालय में एक बॉक्स रखता है। हर कोई अपना पैकेज बॉक्स में डालता है। अब कूरियर शांति से बॉक्स ले सकता है और एक पते से दूसरे पते पर जा सकता है। इससे समय की काफी बचत होती है, क्योंकि उसे हर बार ऑफिस नहीं लौटना पड़ता है। इस उदाहरण में, बॉक्स केवल एक बफ़र है, और कार्यालय एक डेटा स्रोत है। हर बार कार्यालय वापस जाने की तुलना में डिलीवरी करते समय कूरियर के लिए एक बॉक्स से पैकेज लेना बहुत आसान होता है। वह गैसोलीन भी बचाएगा। इसी तरह, एक प्रोग्राम में हर बार डेटा स्रोत को संदर्भित करने की तुलना में बफ़र से डेटा लेने के लिए बहुत कम संसाधन-गहन होता है। नतीजतन,BufferedReader+ अकेले InputStreamReaderसे तेज हैInputStreamReader । हमने प्रदर्शन पर विचार किया है। सुविधा के बारे में क्या? मुख्य लाभ यह है कि Bufferedreaderडेटा को एक समय में न केवल एक वर्ण पढ़ सकता है (हालांकि यह अपनी read()विधि के साथ ऐसा कर सकता है), बल्कि एक समय में पूरी लाइनें भी पढ़ सकता है! यह readLine()विधि का उपयोग करके किया जाता है;

public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("We read this line from the keyboard:");
       System.out.println(s);
   }
}
कंसोल आउटपुट: Java सीखने के लिए CodeGym सबसे अच्छी वेबसाइट है! हम कीबोर्ड से इस पंक्ति को पढ़ते हैं: Java सीखने के लिए CodeGym सबसे अच्छी वेबसाइट है! बड़ी मात्रा में डेटा पढ़ते समय यह विशेष रूप से उपयोगी होता है। पाठ की एक या दो पंक्तियों को वर्ण दर वर्ण पढ़ना अभी भी संभव है। लेकिन "वॉर एंड पीस" में एक बार में एक अक्षर पढ़ना कुछ हद तक समस्याग्रस्त होगा :)
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION