JavaRush /جاوا بلاگ /Random-SD /ڪيبورڊ مان پڙھڻ - "پڙھيندڙ"

ڪيبورڊ مان پڙھڻ - "پڙھيندڙ"

گروپ ۾ شايع ٿيل
سلام! ليڪچرن ۽ ڪمن ۾، اسان سکيو ته ڊيٽا کي ڪنسول ۾ ڪيئن آئوٽ ڪجي، ۽ ان جي برعڪس - ڪيبورڊ مان ڊيٽا پڙهو. ڪيبورڊ مان پڙھڻ - "ريڊرز" - 1توهان هن لاء هڪ پيچيده تعمير استعمال ڪرڻ سکيو:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
پر اسان اڃا تائين هڪ سوال جو جواب نه ڏنو آهي.

اهو ڪيئن ڪم ڪري ٿو؟

حقيقت ۾، ڪنهن به پروگرام اڪثر ڪري پنهنجي پاڻ تي موجود نه آهي. اهو ٻين پروگرامن، سسٽم، انٽرنيٽ، وغيره سان رابطو ڪري سگهي ٿو. لفظ ”ڪميونيڪيٽ“ ذريعي اسان جو سڀ کان اول مطلب آهي ”ڊيٽا مٽائڻ“. اهو آهي، ٻاهران ڪجهه ڊيٽا حاصل ڪريو، ۽، ان جي ابتڙ، توهان جي پنهنجي ڊيٽا کي ڪٿي موڪليو. پروگرامن جي وچ ۾ ڊيٽا جي مٽاسٽا جا ڪيترائي مثال آهن، جيتوڻيڪ روزمره جي زندگيء ۾. تنهن ڪري، ڪيترن ئي سائيٽن تي، رجسٽر ڪرڻ بدران، توهان لاگ ان ڪري سگهو ٿا پنهنجي Facebook يا Twitter اڪائونٽ استعمال ڪندي. هن صورتحال ۾، ٻه پروگرام، چون ٿا، Twitter ۽ سائيٽ جتي توهان رجسٽر ڪرڻ جي ڪوشش ڪري رهيا آهيو، هڪ ٻئي سان ضروري ڊيٽا مٽائي، جنهن کان پوء توهان آخري نتيجو ڏسندا - ڪامياب اختيار. اصطلاح " flow " اڪثر پروگرامنگ ۾ ڊيٽا مٽائڻ جي عمل کي بيان ڪرڻ لاء استعمال ڪيو ويندو آهي . اهو نالو به ڪٿان آيو؟ ”فلو“ پروگرامنگ جي ڀيٽ ۾ درياهه يا نديءَ سان وڌيڪ جڙيل آهي. حقيقت ۾، هي بغير ڪنهن سبب جي ناهي :) هڪ وهڪرو آهي، ذات ۾، ڊيٽا جو هڪ حرڪت وارو ٽڪرو. اھو آھي، پروگرامنگ ۾، اھو پاڻي نه آھي جيڪو "وھڻ" نديء سان، پر ڊيٽا بائيٽ ۽ ڪردارن جي صورت ۾. ڊيٽا جي وهڪري کان، اسان حصن ۾ ڊيٽا حاصل ڪري سگهون ٿا ۽ ان سان ڪجهه ڪري سگهون ٿا. ٻيهر، اچو ته ”پاڻي وهندڙ“ تشبيهه استعمال ڪريون: توهان سوپ پچائڻ لاءِ درياهه مان پاڻي ڪڍي سگهو ٿا، باهه وسائي سگهو ٿا، يا پاڻيءَ جا گل. اسٽريمز استعمال ڪندي، توھان ڪم ڪري سگھوٿا ڪنھن به ڊيٽا ماخذ سان: انٽرنيٽ، توھان جي ڪمپيوٽر جو فائيل سسٽم، يا ٻيو ڪجھ - اھو ڪوئي فرق نٿو پوي. وهڪرو هڪ آفاقي اوزار آهن. اهي پروگرام کي اجازت ڏين ٿا ڊيٽا حاصل ڪرڻ لاءِ ڪٿي به (ايندڙ اسٽريم) ۽ ان کي ڪٿي به موڪليو (ٻاهر وڃڻ وارو سلسلو). انهن جو ڪم هڪ آهي - هڪ جاءِ تي ڊيٽا وٺڻ ۽ ٻئي ڏانهن موڪلڻ. وهڪرو ٻن قسمن ۾ ورهايل آهن:
  1. اچڻ وارو وهڪرو ( Input ) - ڊيٽا حاصل ڪرڻ لاءِ استعمال ڪيو ويندو آهي
  2. ٻاھر نڪرڻ وارو وهڪرو ( آئوٽ پُٽ ) - ڊيٽا موڪلڻ لاءِ.
جاوا ۾ ايندڙ ڊيٽا جي وهڪري ڪلاس ۾ لاڳو ٿئي ٿي InputStream، ۽ ڪلاس ۾ نڪرندڙ ڊيٽا جو وهڪرو OutputStream. پر سلسلن کي ورهائڻ جو هڪ ٻيو طريقو آهي. اهي نه رڳو ايندڙ ۽ ٻاهر نڪرڻ ۾ ورهايل آهن، پر بائيٽ ۽ ڪردار پڻ . هتي معنيٰ بغير وضاحت جي واضح آهي: هڪ بائيٽ اسٽريم معلومات کي بائيٽ جي سيٽ جي صورت ۾ منتقل ڪري ٿو، ۽ هڪ ڪردار وهڪرو معلومات کي اکرن جي سيٽ جي صورت ۾ منتقل ڪري ٿو. هن ليڪچر ۾ اسان ايندڙ ايندڙ اسٽريم جي باري ۾ تفصيل سان وينداسين. ۽ مان آخر ۾ ٻاهر نڪرندڙ لنڪس بابت معلومات ڳنڍيندس، ۽ توهان ان بابت پاڻ پڙهي سگهو ٿا :) سو، اسان جو ڪوڊ:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
توهان شايد ليڪچر پڙهڻ دوران سوچيو ته اهو ڪافي خوفناڪ نظر اچي رهيو هو؟ :) پر اهو صرف ايترو آهي جيستائين اسان اهو سمجهون ته هي ڪم ڪيئن ڪم ڪري ٿو. اچو ته هاڻي ان کي درست ڪريون! اچو ته آخر کان شروع ڪريون. System.inڪلاس جو هڪ اعتراض آهي InputStreamجنهن بابت اسان شروعات ۾ ڳالهايو آهي. هي هڪ ايندڙ وهڪرو آهي، ۽ اهو سسٽم ان پٽ ڊوائيس سان ڳنڍيل آهي - ڪيبورڊ. رستي ۾، توهان ان سان اڻ سڌي طرح واقف آهيو. آخرڪار، توهان اڪثر پنهنجي ڪم ۾ هن جي "ساٿي" کي استعمال ڪندا آهيو - System.out! - ھي ھڪڙو سسٽم ڊيٽا آئوٽSystem.out اسٽريم آھي ، اھو استعمال ڪيو ويندو آھي ڪنسول ڏانھن ٻاھر ڪڍڻ لاءِ ان طريقي سان جيڪو توھان مسلسل استعمال ڪندا آھيو :) - ھڪڙو وهڪرو ڪنسول ڏانھن ڊيٽا موڪلڻ لاءِ، ۽ - ڪيبورڊ مان ڊيٽا حاصل ڪرڻ لاءِ. اهو سادو آهي :) ان کان علاوه: ڪيبورڊ مان ڊيٽا پڙهڻ لاء، اسان هن وڏي تعمير کان سواء ڪري سگهون ٿا ۽ صرف لکي سگهون ٿا: ; System.out.println()System.outSystem.inSystem.in.read()
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
ڪلاس ۾ InputStreamSystem.in، مون کي توهان کي ياد ڏيارڻ ڏيو، ڪلاس جو هڪ اعتراض آهي InputStream) اتي هڪ طريقو آهي read()جيڪو توهان کي ڊيٽا پڙهڻ جي اجازت ڏئي ٿو. ھڪڙو مسئلو: اھو پڙھندو آھي بائيٽ ، نه اکر . اچو ته ڪيبورڊ تان روسي اکر "Ya" پڙهڻ جي ڪوشش ڪريو. ڪنسول آئوٽ:
Я
208
175
10
روسي اکر ڪمپيوٽر جي ميموري ۾ 2 بائيٽ وٺي وڃن ٿا (انگريزي اکرن جي برعڪس، جيڪي صرف 1 کڻن ٿا). انهي صورت ۾، 3 بائيٽ اسٽريم مان پڙهيا ويا: پهرين ٻه اسان جي خط "I" جي نمائندگي ڪن ٿا، ۽ ٻيو هڪ لائن بريڪ آهي (داخل ڪريو). تنهن ڪري، "ننگا" استعمال ڪرڻ جو اختيار System.inاسان کي مناسب نه ٿيندو. انسان (نادر استثنا سان!) بائيٽ پڙهي نٿا سگهن. هي اهو آهي جتي ايندڙ طبقو اسان جي مدد لاءِ اچي ٿو - InputStreamReader! اچو ته سمجهون ته هي ڪهڙي قسم جو جانور آهي.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
اسان نديءَ System.inکي پاس ڪريون ٿا InputStreamReader. عام طور تي، جيڪڏھن توھان ان جو نالو روسي ۾ ترجمو ڪريو، سڀ ڪجھ پڌرو نظر اچي ٿو - "ايندڙ سلسلو جا پڙھندڙ". حقيقت ۾، اهو ئي آهي جيڪو اهو آهي! اسان هڪ طبقاتي اعتراض ٺاهيو InputStreamReader۽ ان کي هڪ ايندڙ وهڪرو پاس ڪيو جنهن مان اهو ڊيٽا پڙهڻ گهرجي. هن معاملي ۾ ...
new InputStreamReader(System.in)
... اسان ان کي ٻڌايو: "توهان سسٽم ان پٽ اسٽريم (ڪي بورڊ) مان ڊيٽا پڙهندا." پر اهو صرف ان جو ڪم ناهي! InputStreamReaderنه صرف وهڪرو مان ڊيٽا حاصل ڪري ٿو. اهو بائيٽ اسٽريمز کي به ڪردار اسٽريم ۾ تبديل ڪري ٿو . ٻين لفظن ۾، توهان کي هاڻي "ڪمپيوٽر" ٻولي مان "انساني" ٻولي ۾ پڙهڻ واري ڊيٽا کي ترجمو ڪرڻ بابت پريشان ٿيڻ جي ضرورت ناهي - InputStreamReaderاهو توهان لاء سڀ ڪجهه ڪندو. InputStreamReaderيقينا، ڊيٽا پڙهي سگهي ٿو نه رڳو ڪنسول مان، پر ٻين هنڌن کان پڻ. مثال طور، فائل مان:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
هتي اسان هڪ ايندڙ ڊيٽا اسٽريم ٺاهيو FileInputStream(هي هڪ قسم آهي InputStream)، ان ۾ فائل ڏانهن رستو گذريو، ۽ وهڪرو پاڻ کي InputStreamReader'y' پاس ڪيو. هاڻي اهو هن فائل مان ڊيٽا پڙهڻ جي قابل هوندو، جيڪڏهن هن رستي تي فائل موجود آهي، يقينا. ڊيٽا پڙهڻ لاءِ (ڪو به مسئلو ناهي ڪٿي کان، ڪنسول کان، هڪ فائل، يا ڪٿي به)، ڪلاس InputStreamReaderپڻ استعمال ڪري ٿو read(). System.in.read()۽ جي وچ ۾ ڇا فرق آهي InputStreamReader.read()؟ اچو ته ساڳيو اکر ”I“ استعمال ڪندي ڳڻڻ جي ڪوشش ڪريون InputStreamReader. اچو ته توهان کي ياد ڏياريان، هي اهو آهي جيڪو مون سوچيو هو System.in.read():
Я
208
175
10
هو ساڳيو ڪم ڪيئن ٿو ڪري سگهي 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);
       }
   }
}
ڪنسول آئوٽ:
Я
1071
10
فرق فوري طور تي نظر اچي ٿو. آخري بائيٽ - لائين بريڪز لاءِ - تبديل نه ٿيو (نمبر 10)، پر پڙھيل اکر "I" ھڪڙي ڪوڊ "1071" ۾ تبديل ٿي ويو. هي علامتن سان پڙهي رهيو آهي! جيڪڏهن توهان اوچتو يقين نه ٿا ڪريو ته ڪوڊ 1071 جو مطلب آهي خط "I"، توهان آساني سان هن جي تصديق ڪري سگهو ٿا :)
import java.io.IOException;

public class Main {

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

       char x = 1071;
       System.out.println(x);
   }
}
ڪنسول آئوٽ:

Я
پر جيڪڏهن InputStreamReaderاهو تمام سٺو آهي، توهان کي وڌيڪ ضرورت ڇو آهي BufferedReader؟ InputStreamReaderٻئي ڊيٽا پڙهي سگھن ٿا ۽ بائيٽ کي ڪردارن ۾ تبديل ڪري سگھن ٿا - اسان کي ٻيو ڇا گھرجي؟ ٻيو پڙهندڙ ڇو؟ :/ جواب تمام سادو آهي - وڏي پيداوار ۽ وڏي سهولت لاءِ . اچو ته ڪارڪردگي سان شروع ڪريون. جڏهن ڊيٽا پڙهڻ، BufferedReader هڪ خاص علائقو استعمال ڪري ٿو - هڪ بفر، جتي اهو پڙهيل ڪردارن کي "شامل" ڪري ٿو. نتيجي طور، جڏھن اسان کي پروگرام ۾ انھن اکرن جي ضرورت پوندي، اھي بفر مان کنيا ويندا، ۽ سڌو سنئون ڊيٽا جي ماخذ (ڪي بورڊ، فائل، وغيره) کان نه، ۽ اھو ڪيترائي وسيلا بچائيندو آھي. سمجھڻ لاء اهو ڪيئن ڪم ڪري ٿو، تصور ڪريو، مثال طور، وڏي ڪمپني ۾ ڪوريئر جو ڪم. ڪوريئر آفيس ۾ بيٺو آهي ۽ انتظار ڪري ٿو ته پارسل هن کي پهچائڻ لاءِ آندو وڃي. هر دفعي هو هڪ نئون پارسل وصول ڪري ٿو، هو فوري طور تي روڊ تي اچي سگهي ٿو. پر شايد ڏينهن ۾ ڪيترائي پارسل هوندا، ۽ هن کي هر وقت آفيس ۽ پتي جي وچ ۾ سفر ڪرڻو پوندو. ان جي بدران، ڪوريئر آفيس ۾ هڪ باڪس رکيو جتي هرڪو پنهنجو پارسل رکي سگهي ٿو. هاڻي ڪوريئر آرام سان باڪس وٺي سگهي ٿو ۽ پتي ڏانهن وڃي ٿو - هو گهڻو وقت بچائيندو، ڇاڪاڻ ته هن کي هر وقت آفيس ڏانهن موٽڻ جي ضرورت ناهي. هن مثال ۾ باڪس صحيح طور تي بفر آهي، ۽ آفيس ڊيٽا جو ذريعو آهي. ڪوريئر لاءِ اهو تمام آسان آهي ته هڪ عام باڪس مان هڪ خط کڻي جڏهن ان کي پهچائڻ وقت هر وقت آفيس وڃڻ کان. اهو پڻ گئس بچائيندو. اهو هڪ پروگرام ۾ ساڳيو آهي - اهو هر وقت ڊيٽا جي ماخذ تائين رسائي ڪرڻ جي بجاءِ بفر مان ڊيٽا وٺڻ لاءِ تمام گهٽ وسيلا-گھڻي آهي. اهو ئي سبب آهي ته BufferedReader+ InputStreamReaderصرف کان وڌيڪ تيز ڪم ڪري ٿو InputStreamReader. اسان ڪارڪردگي کي ترتيب ڏنو آهي، پر سهولت بابت ڇا؟ بنيادي فائدو اهو آهي ته BufferedReaderاهو ڊيٽا پڙهي سگهي ٿو نه رڳو هڪ وقت ۾ هڪ ڪردار (جيتوڻيڪ read()اهو پڻ هن مقصد لاء هڪ طريقو آهي)، پر سڄي لائين پڻ! اهو استعمال ڪندي ڪيو ويندو آهي 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("We read this line from the keyboard:");
       System.out.println(s);
   }
}
ڪنسول آئوٽ:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
اهو خاص طور تي مفيد آهي جڏهن ڊيٽا جي وڏي مقدار پڙهڻ. متن جي هڪ يا ٻه سٽون اڃا به پڙهي سگھجن ٿيون اکرن جي حساب سان. پر ”جنگ ۽ امن“ کي هڪ وقت ۾ هڪ اکر ڳڻڻ ڪجهه مشڪل ٿي پوندو :) هاڻي موضوعن جو ڪم توهان لاءِ وڌيڪ واضح ٿي چڪو آهي. وڌيڪ مطالعي لاء، هتي توهان لاء هڪ اضافي ذريعو آهي: هتي توهان وڌيڪ پڙهي سگهو ٿا ايندڙ ۽ ٻاهرئين وهڪري بابت. BufferedReaderاسان جي شاگردن مان هڪ وڊيو جائزو . ها، ها، اسان جا شاگرد نه رڳو پاڻ سکندا آهن، پر ٻين لاءِ تعليمي وڊيوز پڻ رڪارڊ ڪندا آهن! اسان جي چينل کي پسند ڪرڻ ۽ سبسڪرائيب ڪرڻ نه وساريو :)
اهو بهتر آهي ته توهان پنهنجي پڙهائي جي شروعات کان سرڪاري دستاويز پڙهڻ لاء پاڻ کي عادت ڏيو. اهو ٻولي بابت ڄاڻ جو بنيادي ذريعو آهي، ۽ اڪثر جواب هميشه اتي ڳولي سگهجن ٿا.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION