CodeGym /جاوا بلاگ /Random-SD /ڪيبورڊ مان پڙهڻ: "پڙهندڙ"
John Squirrels
سطح
San Francisco

ڪيبورڊ مان پڙهڻ: "پڙهندڙ"

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

دنيا ۾ اهو ڪيئن ڪم ڪندو آهي؟

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

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
ڪلاس InputStream(ياد رکو، System.inهڪ InputStreamاعتراض آهي) هڪ read()طريقو آهي جيڪو توهان کي ڊيٽا پڙهڻ جي اجازت ڏئي ٿو. اتي ھڪڙو مسئلو آھي: اھو پڙھندو آھي bytes ، نه اکر . صرف انگريزي اکر استعمال ڪرڻ بورنگ آهي ان ڪري اچو ته ڪي بورڊ تان چيني اکر "魚" پڙهڻ جي ڪوشش ڪريون (صرف هن خط کي هتان کان نقل ڪريو ۽ پي سي تي ctrl + v يا Mac تي Command + v استعمال ڪندي ڪنسول ۾ پيسٽ ڪريو ). هن ڪردار جي معنيٰ آهي ’مڇيءَ‘ جهڙي طرح. ڪنسول آئوٽ: 233 173 154 10 هي علامت ۽ ٻيا ڪيترائي چيني ڪمپيوٽر جي ميموري ۾ 3 بائيٽ تي قبضو ڪن ٿا (لاطيني اکرن جي برعڪس، جيڪي صرف 1 بائيٽ تي قبضو ڪن ٿا). ھن حالت ۾، 4 بائيٽ اسٽريم مان پڙھيا ويندا آھن: پھريون ٽي ڪردار "魚" جي نمائندگي ڪن ٿا، ۽ ٻيو بائيٽ ھڪڙي نئين لائين (Enter) جي نمائندگي ڪري ٿو. ان جي مطابق، 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. هاڻي اهو فائل مان ڊيٽا پڙهڻ جي قابل هوندو (جيڪڏهن هڪ فائل اصل ۾ موجود آهي، يقينا). اسان ڊيٽا کي پڙهڻ لاءِ InputStreamReaderڪلاس جو read()طريقو پڻ استعمال ڪندا آهيون (ڊيٽا جو ماخذ ڪوئي فرق نٿو پوي: ڪنسول، فائيل، يا ٻيو ڪٿي). System.in.read()۽ وچ ۾ ڇا فرق آهي InputStreamReader.read()؟\ اچو ته ٻيهر ڪوشش ڪريون "魚" جي ڪردار کي هڪ سان InputStreamReader. مان توهان کي ياد ڏياريان ٿو جيڪو اصل ۾ پڙهيو ويو هو System.in.read(): 233 173 154 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);
       }
   }
}
ڪنسول آئوٽ: 39770 10 فرق فوري طور تي ظاهر ٿئي ٿو. آخري بائيٽ (نئين لڪير جي نمائندگي ڪندي) باقي رهي ٿو (نمبر 10)، پر ڪردار "魚" هڪ واحد ڪوڊ "39770" ۾ تبديل ڪيو ويو. اِن جو مطلب آهي ڪردارن کي پڙهڻ جو! جيڪڏهن توهان اهو نه ٿا سمجهو ته 39770 خط "魚" جي نمائندگي ڪري ٿو، اهو پنهنجو پاڻ کي قائل ڪرڻ آسان آهي :)
import java.io.IOException;

public class Main {

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

       char x = 39770;
       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);
   }
}
ڪنسول آئوٽ: ڪوڊ گيم جاوا سکڻ لاءِ بهترين ويب سائيٽ آهي! اسان هي لڪير ڪي بورڊ تان پڙهون ٿا: CodeGym جاوا سکڻ لاءِ بهترين ويب سائيٽ آهي! اهو خاص طور تي مفيد آهي جڏهن ڊيٽا جي وڏي مقدار پڙهڻ. لکڻ جي هڪ يا ٻه سٽون پڙهڻ لاءِ اکر اکر اکر اڃا به ممڪن آهي. پر "جنگ ۽ امن" ۾ پڙهڻ هڪ وقت ۾ هڪ خط ڪجهه ڏکيو هوندو :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION