CodeGym /Java Blog /यादृच्छिक /BuffreredReader आणि InputStreamReader वर्गांसह काम करण्या...
John Squirrels
पातळी 41
San Francisco

BuffreredReader आणि InputStreamReader वर्गांसह काम करण्याचा सराव करा

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! सोयीसाठी आजचा धडा दोन भागात विभागला जाईल. आम्ही पूर्वी स्पर्श केलेल्या काही जुन्या विषयांची पुनरावृत्ती करू, आणि आम्ही काही नवीन वैशिष्ट्यांचा विचार करू :) चला पहिल्यापासून सुरुवात करूया. आपण आधीच अनेक वेळा एक वर्ग आहे 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
BuffreredReader आणि InputStreamReader वर्ग - 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!  BuffreredReader आणि InputStreamReader वर्गांसह काम करण्याचा सराव करा - 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!"); 
   } 
}
परिणामी, पहिली स्ट्रिंग मजकूर फाइलवर लिहिली जाते, आणि दुसरी कन्सोलमध्ये प्रदर्शित केली जाते :) तुम्ही हा कोड तुमच्या IDE मध्ये कॉपी करू शकता आणि तो चालवू शकता. मजकूर फाइल उघडा आणि तुम्हाला दिसेल की तेथे स्ट्रिंग यशस्वीरित्या लिहिली गेली आहे :) यासह, आमचा धडा संपला आहे. आज आम्ही प्रवाह आणि वाचकांसह कसे कार्य करावे ते आठवले. ते एकमेकांपेक्षा कसे वेगळे आहेत हे आम्हाला आठवले आणि काही नवीन क्षमतांबद्दल शिकलो System.out, ज्या आम्ही जवळजवळ प्रत्येक धड्यात वापरल्या आहेत :) पुढील धड्यांपर्यंत!
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION