CodeGym/Java Blog/अनियमित/बफ़रेडरीडर और इनपुटस्ट्रीमरीडर कक्षाओं के साथ काम करने का...
John Squirrels
स्तर 41
San Francisco

बफ़रेडरीडर और इनपुटस्ट्रीमरीडर कक्षाओं के साथ काम करने का अभ्यास करें

अनियमित ग्रुप में प्रकाशित
सदस्य
नमस्ते! सुविधा के लिए आज के पाठ को दो भागों में बांटा जाएगा। हम कुछ पुराने विषयों को दोहराएंगे जिन्हें हमने पहले छुआ था, और हम कुछ नई सुविधाओं पर विचार करेंगे :) चलिए पहले वाले से शुरू करते हैं। आप पहले से ही BufferedReaderकई बार एक कक्षा पसंद कर चुके हैं। मुझे आशा है कि आपके पास इस कथन को भूलने का समय नहीं होगा:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
आगे पढ़ने से पहले, यह याद रखने का प्रयास करें कि प्रत्येक घटक — System.in, InputStreamReader, BufferedReader— किसके लिए उत्तरदायी है और इसकी आवश्यकता क्यों है। आपको याद है? यदि नहीं, कोई चिंता नहीं। :) यदि आप कुछ भूल गए हैं, तो इस पाठ को फिर से पढ़ें , जो पाठक वर्गों को समर्पित है। हम संक्षेप में याद करेंगे कि उनमें से प्रत्येक क्या कर सकता है। System.in— यह कीबोर्ड से डेटा प्राप्त करने के लिए एक स्ट्रीम है।  सिद्धांत रूप में, यह अकेले पाठ को पढ़ने के लिए आवश्यक तर्क को लागू करने के लिए पर्याप्त होगा। लेकिन, जैसा कि आपको याद होगा, System.inकेवल बाइट पढ़ सकते हैं, वर्ण नहीं:
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
यदि हम इस कोड को निष्पादित करते हैं और सिरिलिक अक्षर "Й" दर्ज करते हैं, तो आउटपुट होगा:
Й
208
153
10
सिरिलिक वर्ण स्मृति में 2 बाइट्स पर कब्जा कर लेते हैं, और वे स्क्रीन पर प्रदर्शित होते हैं। संख्या 10 एक लाइन फीड कैरेक्टर का दशमलव प्रतिनिधित्व है, यानी एंटर दबाने से। बाइट पढ़ना एक ऐसा आनंद है, इसलिए इसका उपयोग करना System.inबहुत सुविधाजनक नहीं है। सिरिलिक (और अन्य) अक्षरों को सही ढंग से पढ़ने के लिए, हम 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);
       }
   }
}
हम एक ही अक्षर "ई" दर्ज करते हैं, लेकिन इस बार परिणाम अलग है:
Й
1049
10
InputStreamReaderदो बाइट्स (208 और 153) को एक संख्या 1049 में कनवर्ट किया गया। वर्णों को पढ़ने का यही अर्थ है। 1049 सिरिलिक अक्षर "Й" से मेल खाता है। हम खुद को आसानी से समझा सकते हैं कि यह सच है:
public class Main {

   public static void main(String[] args) throws IOException {
       char x = 1049;
       System.out.println(x);
   }
}
कंसोल आउटपुट:
Й
और के रूप में forBufferedReader(और सामान्य तौर पर BufferedAnythingYouWant), प्रदर्शन को अनुकूलित करने के लिए बफ़र्ड कक्षाओं का उपयोग किया जाता है। प्रदर्शन के मामले में डेटा स्रोत (फ़ाइल, कंसोल, वेब संसाधन) तक पहुँचना काफी महंगा है। इसलिए, एक्सेस की संख्या को कम करने के लिए, BufferedReaderडेटा को एक विशेष बफर में पढ़ता है और जमा करता है, और हम इसे वहां से प्राप्त करते हैं। नतीजतन, डेटा स्रोत तक पहुंचने की संख्या कम हो जाती है - संभवतः परिमाण के कई आदेशों से! की एक और BufferedReaderविशेषता और सामान्य से अधिक इसका लाभ InputStreamReaderअत्यंत सहायक 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 ("The user entered the following text:");
       System.out.println(s);
       reader.close();
   }
}
BufferedReader+InputStreamReader is faster than InputStreamReader alone
The user entered the following text:
BufferedReader+InputStreamReader is faster than InputStreamReader alone
बफ़रेडरीडर और इनपुटस्ट्रीमरीडर कक्षाओं के साथ काम करने का अभ्यास करें - 2बेशक, BufferedReaderबहुत लचीला है। आप कीबोर्ड के साथ काम करने तक ही सीमित नहीं हैं। उदाहरण के लिए, आप केवल पाठक को आवश्यक URL पास करके, सीधे वेब से डेटा पढ़ सकते हैं:
public class URLReader {

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

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
आप फ़ाइल पथ को पास करके फ़ाइल से डेटा पढ़ सकते हैं:
public class Main {

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

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

System.out की जगह

अब आइए एक दिलचस्प क्षमता पर नज़र डालें जिसे हमने पहले नहीं छुआ है। जैसा कि आप निश्चित रूप से याद करते हैं, Systemकक्षा में दो स्थिर क्षेत्र होते हैं - System.inऔर  System.out। ये जुड़वां भाई स्ट्रीम ऑब्जेक्ट हैं। System.inएक है InputStream। और System.out एक है PrintStream। अभी, हम बात करेंगे  System.out। यदि हम Systemकक्षा के स्रोत कोड में जाते हैं, तो हम इसे देखते हैं:
public final class System {
……………...
public final static PrintStream out = null;
 …………
}
इस प्रकार,  वर्ग System.out  का एक साधारण स्थिर चर है । Systemइसमें जादू की कोई बात नहीं है :) outचर एक PrintStreamसंदर्भ है। यहां एक दिलचस्प सवाल है: कब System.out.println()निष्पादित किया जाता है, आउटपुट कंसोल पर क्यों जाता है और कहीं और नहीं? और क्या इसे किसी तरह बदला जा सकता है? उदाहरण के लिए, मान लीजिए कि हम कंसोल से डेटा पढ़ना चाहते हैं और इसे टेक्स्ट फ़ाइल में लिखना चाहते हैं। System.outक्या अतिरिक्त पाठक और लेखक वर्गों की बजाय इसे किसी भी तरह से लागू करना संभव है  ? दरअसल, यह है :) और हम इसे तब भी कर सकते हैं जब System.outचर को संशोधक के साथ चिह्नित किया गया हो final!  बफ़रेडरीडर और इनपुटस्ट्रीमरीडर कक्षाओं के साथ काम करने का अभ्यास करें - 3तो ऐसा करने के लिए हमें क्या चाहिए? सबसे पहले, हमें PrintStreamमौजूदा वस्तु को बदलने के लिए एक नई वस्तु की आवश्यकता है। वर्तमान वस्तु, में सेटSystemवर्ग डिफ़ॉल्ट रूप से, हमारे उद्देश्यों की पूर्ति नहीं करता है: यह कंसोल की ओर इशारा करता है। आपको एक नई फ़ाइल बनाने की आवश्यकता है जो एक पाठ फ़ाइल की ओर इशारा करती है - हमारे डेटा के लिए "गंतव्य"। System.outदूसरा, हमें यह समझने की आवश्यकता है कि वेरिएबल को एक नया मान कैसे निर्दिष्ट किया जाए । आप एक साधारण असाइनमेंट ऑपरेटर का उपयोग नहीं कर सकते, क्योंकि वेरिएबल चिह्नित है final। आइए अंत से पीछे की ओर काम करें। जैसे ही होता है, Systemकक्षा में वह विधि होती है जिसकी हमें आवश्यकता होती है: setOut(). यह एक PrintStreamवस्तु लेता है और इसे आउटपुट के लिए गंतव्य के रूप में सेट करता है। हमें बस इतना ही चाहिए! PrintStreamजो कुछ बचा है वह एक वस्तु बनाना है । यह भी आसान है:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
पूरा कोड इस तरह दिखेगा:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later
       we can switch back to console output */

       PrintStream console = System.out;
       // Assign a new value to System.out
       System.setOut(filePrintStream);
       System.out.println("This line will be written to the text file");

       // Restore the old value of System.out
       System.setOut(console);
       System.out.println("But this line will be output to the console!");
   }
}
नतीजतन, पहला स्ट्रिंग टेक्स्ट फ़ाइल में लिखा गया है, और दूसरा कंसोल में प्रदर्शित होता है :) आप इस कोड को अपने आईडीई में कॉपी कर सकते हैं और इसे चला सकते हैं। पाठ फ़ाइल खोलें और आप देखेंगे कि स्ट्रिंग सफलतापूर्वक वहाँ लिखी गई है :) इसके साथ, हमारा पाठ समाप्त हो गया है। आज हमने याद किया कि कैसे धाराओं और पाठकों के साथ काम करना है। हमने याद किया कि वे एक दूसरे से कैसे भिन्न हैं और की कुछ नई क्षमताओं के बारे में सीखा System.out, जिनका उपयोग हमने लगभग हर पाठ में किया है :) अगले पाठ तक!
टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं