سلام! ليڪچرن ۽ ڪمن ۾، اسان سکيو ته ڊيٽا کي ڪنسول ۾ ڪيئن آئوٽ ڪجي، ۽ ان جي برعڪس - ڪيبورڊ مان ڊيٽا پڙهو. توهان هن لاء هڪ پيچيده تعمير استعمال ڪرڻ سکيو:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
پر اسان اڃا تائين هڪ سوال جو جواب نه ڏنو آهي.
اهو ڪيئن ڪم ڪري ٿو؟
حقيقت ۾، ڪنهن به پروگرام اڪثر ڪري پنهنجي پاڻ تي موجود نه آهي. اهو ٻين پروگرامن، سسٽم، انٽرنيٽ، وغيره سان رابطو ڪري سگهي ٿو. لفظ ”ڪميونيڪيٽ“ ذريعي اسان جو سڀ کان اول مطلب آهي ”ڊيٽا مٽائڻ“. اهو آهي، ٻاهران ڪجهه ڊيٽا حاصل ڪريو، ۽، ان جي ابتڙ، توهان جي پنهنجي ڊيٽا کي ڪٿي موڪليو. پروگرامن جي وچ ۾ ڊيٽا جي مٽاسٽا جا ڪيترائي مثال آهن، جيتوڻيڪ روزمره جي زندگيء ۾. تنهن ڪري، ڪيترن ئي سائيٽن تي، رجسٽر ڪرڻ بدران، توهان لاگ ان ڪري سگهو ٿا پنهنجي Facebook يا Twitter اڪائونٽ استعمال ڪندي. هن صورتحال ۾، ٻه پروگرام، چون ٿا، Twitter ۽ سائيٽ جتي توهان رجسٽر ڪرڻ جي ڪوشش ڪري رهيا آهيو، هڪ ٻئي سان ضروري ڊيٽا مٽائي، جنهن کان پوء توهان آخري نتيجو ڏسندا - ڪامياب اختيار. اصطلاح " flow " اڪثر پروگرامنگ ۾ ڊيٽا مٽائڻ جي عمل کي بيان ڪرڻ لاء استعمال ڪيو ويندو آهي . اهو نالو به ڪٿان آيو؟ ”فلو“ پروگرامنگ جي ڀيٽ ۾ درياهه يا نديءَ سان وڌيڪ جڙيل آهي. حقيقت ۾، هي بغير ڪنهن سبب جي ناهي :) هڪ وهڪرو آهي، ذات ۾، ڊيٽا جو هڪ حرڪت وارو ٽڪرو. اھو آھي، پروگرامنگ ۾، اھو پاڻي نه آھي جيڪو "وھڻ" نديء سان، پر ڊيٽا بائيٽ ۽ ڪردارن جي صورت ۾. ڊيٽا جي وهڪري کان، اسان حصن ۾ ڊيٽا حاصل ڪري سگهون ٿا ۽ ان سان ڪجهه ڪري سگهون ٿا. ٻيهر، اچو ته ”پاڻي وهندڙ“ تشبيهه استعمال ڪريون: توهان سوپ پچائڻ لاءِ درياهه مان پاڻي ڪڍي سگهو ٿا، باهه وسائي سگهو ٿا، يا پاڻيءَ جا گل. اسٽريمز استعمال ڪندي، توھان ڪم ڪري سگھوٿا ڪنھن به ڊيٽا ماخذ سان: انٽرنيٽ، توھان جي ڪمپيوٽر جو فائيل سسٽم، يا ٻيو ڪجھ - اھو ڪوئي فرق نٿو پوي. وهڪرو هڪ آفاقي اوزار آهن. اهي پروگرام کي اجازت ڏين ٿا ڊيٽا حاصل ڪرڻ لاءِ ڪٿي به (ايندڙ اسٽريم) ۽ ان کي ڪٿي به موڪليو (ٻاهر وڃڻ وارو سلسلو). انهن جو ڪم هڪ آهي - هڪ جاءِ تي ڊيٽا وٺڻ ۽ ٻئي ڏانهن موڪلڻ. وهڪرو ٻن قسمن ۾ ورهايل آهن:- اچڻ وارو وهڪرو ( Input ) - ڊيٽا حاصل ڪرڻ لاءِ استعمال ڪيو ويندو آهي
- ٻاھر نڪرڻ وارو وهڪرو ( آئوٽ پُٽ ) - ڊيٽا موڪلڻ لاءِ.
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()
جيڪو توهان کي ڊيٽا پڙهڻ جي اجازت ڏئي ٿو. ھڪڙو مسئلو: اھو پڙھندو آھي بائيٽ ، نه اکر . اچو ته ڪيبورڊ تان روسي اکر "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
اسان جي شاگردن مان هڪ وڊيو جائزو . ها، ها، اسان جا شاگرد نه رڳو پاڻ سکندا آهن، پر ٻين لاءِ تعليمي وڊيوز پڻ رڪارڊ ڪندا آهن! اسان جي چينل کي پسند ڪرڻ ۽ سبسڪرائيب ڪرڻ نه وساريو :)
- BufferedReader/InputStreamReader - جاوا رش ليڪچرن مان ھڪڙو وقف ڪيل
BufferedReader
۽InputStreamReader
- ڪلاس InputStreamReader
- ڪلاس بفرڊ ريڊر - ڪلاس بابت Oracle دستاويز
BufferedReader
۽InputStreamReader
.
GO TO FULL VERSION