नमस्ते! सुविधा के लिए आज के पाठ को दो भागों में बांटा जाएगा। हम कुछ पुराने विषयों को दोहराएंगे जिन्हें हमने पहले छुआ था, और हम कुछ नई सुविधाओं पर विचार करेंगे :) चलिए पहले वाले से शुरू करते हैं। आप पहले से ही
बेशक,
तो ऐसा करने के लिए हमें क्या चाहिए? सबसे पहले, हमें
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

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
! 
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
, जिनका उपयोग हमने लगभग हर पाठ में किया है :) अगले पाठ तक!
अधिक पढ़ना: |
---|
GO TO FULL VERSION