CodeGym /Java Blog /यादृच्छिक /कीबोर्डवरून वाचन: "वाचक"
John Squirrels
पातळी 41
San Francisco

कीबोर्डवरून वाचन: "वाचक"

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! लेव्हल 3 मधील धडे आणि कार्ये तुम्हाला कन्सोलवर सामग्री कशी प्रदर्शित करायची आणि कीबोर्डवरून डेटा कसा वाचायचा हे शिकवले.
कीबोर्डवरून वाचन: "वाचक" - १
हे पूर्ण करण्यासाठी तुम्ही खालील जटिल रचना वापरण्यास देखील शिकलात:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
परंतु एक प्रश्न आहे ज्याचे उत्तर आम्ही अद्याप दिलेले नाही.

जगात हे कसे कार्य करते?

प्रत्यक्षात, कार्यक्रम क्वचितच पूर्णपणे स्वतंत्र असतात. ते इतर प्रोग्राम्स, सिस्टम्स, इंटरनेट इत्यादींशी संवाद साधतात. "संवाद" द्वारे आमचा मुख्य अर्थ "डेटा एक्सचेंज" असा होतो. म्हणजेच, ते काही बाह्य डेटा प्राप्त करतात आणि अंतर्गत प्रोग्राम डेटा कुठेतरी पाठवतात. डेटाची देवाणघेवाण करणार्‍या प्रोग्रामची उदाहरणे दैनंदिन जीवनात भरपूर आहेत. उदाहरणार्थ, अनेक वेबसाइट तुम्हाला नोंदणी करण्याऐवजी तुमचे Facebook किंवा Twitter खाते वापरून साइन इन करू देतात. या परिस्थितीत, दोन प्रोग्राम्स (उदा. Twitter आणि तुम्ही साइन इन करत असलेली वेबसाइट) आवश्यक डेटाची देवाणघेवाण करतात. अंतिम परिणाम म्हणजे तुम्ही यशस्वीरित्या साइन इन केले आहे. "प्रवाह" हा शब्दडेटा एक्सचेंजच्या प्रक्रियेचे वर्णन करण्यासाठी वापरले जाते. हे नाव कुठून आले? तुमच्या अनुभवात, "प्रवाह" नद्यांशी आणि प्रोग्रामिंगपेक्षा अधिक संबंधित असू शकतो. हा अपघात नाही :) प्रवाह हा थोडक्यात डेटाचा एक हलणारा तुकडा आहे. दुसऱ्या शब्दांत, प्रोग्रामिंगमध्ये, ते पाणी नाही जे वाहते - परंतु बाइट्स आणि वर्णांच्या स्वरूपात डेटा. आम्ही डेटा प्रवाहातून डेटाचे बिट प्राप्त करू शकतो आणि नंतर त्यांचा वापर करू शकतो. पुन्हा, आम्ही पाणी/प्रवाह सादृश्य वापरु: तुम्ही सूप बनवण्यासाठी, आग विझवण्यासाठी किंवा तुमच्या फुलांना पाणी देण्यासाठी नदीतून पाणी काढू शकता. प्रवाह तुम्हाला कोणत्याही डेटा स्रोतासह कार्य करू देतात: इंटरनेट असो, तुमच्या संगणकाची फाइल सिस्टीम किंवा इतर काही असो — याने काही फरक पडत नाही. प्रवाह हे एक सार्वत्रिक साधन आहे. ते प्रोग्रामला कुठूनही (इनपुट स्ट्रीम) डेटा प्राप्त करण्यास आणि कोठेही (आउटपुट प्रवाह) पाठविण्याची परवानगी देतात. त्यांचे कार्य समान आहे: एका ठिकाणाहून डेटा घेणे आणि दुसर्या ठिकाणी पाठवणे. दोन प्रकारचे प्रवाह आहेत:
  1. डेटा प्राप्त करण्यासाठी इनपुट प्रवाह वापरले जातात
  2. आउटपुट प्रवाह डेटा पाठवण्यासाठी आहेत.
InputStreamJava मध्ये, हे प्रवाह आणि वर्गांद्वारे लागू केले जातात 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()पद्धत आहे जी तुम्हाला डेटा वाचू देते. एक समस्या आहे: ते बाइट वाचते , वर्ण नाही . फक्त इंग्रजी अक्षरे वापरणे कंटाळवाणे आहे म्हणून कीबोर्डवरून "魚" चा चिनी अक्षर वाचण्याचा प्रयत्न करूया (फक्त येथून हे अक्षर कॉपी करा आणि PC वर ctrl + v किंवा Mac वर Command + 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. 魚 233 173 154 10 आणिSystem.in.read() तेच कार्य कसे करते ?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);
   }
}
कन्सोल आउटपुट: जावा शिकण्यासाठी कोडजिम ही सर्वोत्तम वेबसाइट आहे! आम्ही कीबोर्डवरून ही ओळ वाचतो: CodeGym जावा शिकण्यासाठी सर्वोत्तम वेबसाइट आहे! मोठ्या प्रमाणात डेटा वाचताना हे विशेषतः उपयुक्त आहे. अक्षरानुसार मजकूराच्या एक किंवा दोन ओळी वाचणे अजूनही व्यवहार्य आहे. पण "वॉर अँड पीस" मध्ये एका वेळी एक अक्षर वाचणे काहीसे समस्याप्रधान असेल :)
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION