JavaRush /جاوا بلاگ /Random-SD /BufferedReader ۽ InputStreamReader ڪلاسن سان ڪم ڪرڻ جي مش...

BufferedReader ۽ InputStreamReader ڪلاسن سان ڪم ڪرڻ جي مشق ڪريو

گروپ ۾ شايع ٿيل
سلام! اڄ جي ليڪچر کي ٻن حصن ۾ ورهايو ويندو. اسان ڪجھ پراڻن عنوانن کي ورجائينداسون جن تي اسان اڳي ئي ڇنڊڇاڻ ڪري چڪا آهيون، ۽ ڪجهه نئين خاصيتن تي نظر وجهون ٿا :) BuffreredReader ۽ InputStreamReader ڪلاسن سان ڪم ڪرڻ جي مشق ڪريو - 1اچو ته پهرين سان شروع ڪريون. ورجائي سکيا جي ماءُ آهي :) توهان اڳ ۾ ئي اهڙي ڪلاس استعمال ڪري چڪا آهيو 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);
       }
   }
}
جيڪڏهن اسان هن ڪوڊ کي هلائيندا آهيون ۽ ڪنسول ۾ خط "Y" داخل ڪندا آهيون، پيداوار هن طرح ٿيندي:

Й
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);
   }
}
ڪنسول آئوٽ:

Й
خير، جيئن ته BufferedReader'a' (۽ عام طور تي - Buffered Anything)، بفر ٿيل ڪلاس استعمال ڪيا ويندا آهن ڪارڪردگي کي بهتر ڪرڻ لاءِ. ڊيٽا جي ذريعن تائين رسائي (فائل، ڪنسول، انٽرنيٽ تي وسيلا) ڪارڪردگي جي لحاظ کان بلڪه قيمتي آپريشن آهي. تنهن ڪري، اهڙين ڪالن جي تعداد کي گهٽائڻ لاء، BufferedReaderاهو پڙهي ٿو ۽ ڊيٽا گڏ ڪري ٿو خاص بفر ۾، جتان اسان ان کي بعد ۾ وصول ڪري سگهون ٿا. نتيجي طور، ڊيٽا جي ماخذ تي ڪالن جو تعداد ڪيترن ئي ڀيرا يا ان کان به ڏهه ڀيرا گھٽجي ويو آهي! هڪ ٻي اضافي خصوصيت BufferedReader'a ۽ ان جو فائدو باقاعده تي 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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
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"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
نتيجي طور، پھرين لڪير ھڪڙي ٽيڪسٽ فائل ۾ لکجي ويندي، ۽ ٻي ٻاھر کنسول ڏانھن ويندي :) توھان ھن ڪوڊ کي پنھنجي IDE ۾ نقل ڪري سگھوٿا ۽ ان کي هلائي سگھو ٿا. ٽيڪسٽ فائل کي کولڻ سان، توهان ڏسندا ته اتي گهربل لائن ڪاميابي سان لکي وئي آهي :) اهو ليڪچر ختم ڪري ٿو. اڄ اسان کي ياد آيو ته اسٽريم ۽ پڙهندڙن سان ڪيئن ڪم ڪجي، ياد آيو ته اهي ڪيئن هڪ ٻئي کان مختلف آهن ۽ نئين خاصيتن بابت سکياسين System.outجيڪي اسان تقريبن هر سبق ۾ استعمال ڪيون آهن :) توهان کي ايندڙ ليڪچرن ۾ ملنداسين!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION