CodeGym /جاوا بلاگ /Random-SD /BuffreredReader ۽ InputStreamReader طبقن سان ڪم ڪرڻ جي مش...
John Squirrels
سطح
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 هڪ لڪير فيڊ ڪردار جي ڊيسيمل نمائندگي آهي، يعني Enter کي دٻائڻ کان. بائيٽ پڙهڻ هڪ اهڙي خوشي آهي، تنهنڪري استعمال ڪرڻ 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); 
       } 
   } 
}
اسان ساڳيو اکر "Y" داخل ڪيو، پر نتيجو هن ڀيري مختلف آهي:

Й 
1049 
10
InputStreamReaderٻن بائيٽ (208 ۽ 153) کي سنگل نمبر 1049 ۾ تبديل ڪيو. اکر پڙهڻ جو مطلب اهو آهي. 1049 سيريلڪ اکر "Y" سان ملندو آهي. اسان آساني سان پاڻ کي قائل ڪري سگهون ٿا ته هي سچ آهي:

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