JavaRush /جاوا بلاگ /Random-UR /کی بورڈ سے پڑھنا - "قارئین"

کی بورڈ سے پڑھنا - "قارئین"

گروپ میں شائع ہوا۔
ہیلو! لیکچرز اور کاموں میں، ہم نے سیکھا کہ کنسول میں ڈیٹا کیسے آؤٹ پٹ کرنا ہے، اور اس کے برعکس - کی بورڈ سے ڈیٹا پڑھیں۔ کی بورڈ سے پڑھنا - "قارئین" - 1یہاں تک کہ آپ نے اس کے لئے ایک پیچیدہ تعمیر کا استعمال کرنا سیکھا:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
لیکن ہم نے ابھی تک ایک سوال کا جواب نہیں دیا۔

یہ کیسے کام کرتا ہے؟

درحقیقت، کوئی بھی پروگرام اکثر اپنے طور پر موجود نہیں ہوتا ہے۔ یہ دوسرے پروگراموں، سسٹمز، انٹرنیٹ وغیرہ کے ساتھ بات چیت کر سکتا ہے۔ لفظ "مواصلات" سے ہمارا مطلب سب سے پہلے "ڈیٹا کا تبادلہ" ہے۔ یعنی باہر سے کچھ ڈیٹا وصول کریں اور اس کے برعکس اپنا ڈیٹا کہیں بھیجیں۔ پروگراموں کے درمیان ڈیٹا کے تبادلے کی بہت سی مثالیں ہیں، یہاں تک کہ روزمرہ کی زندگی میں بھی۔ لہذا، بہت ساری سائٹوں پر، رجسٹر کرنے کے بجائے، آپ اپنے فیس بک یا ٹویٹر اکاؤنٹ کا استعمال کرکے لاگ ان کرسکتے ہیں۔ اس صورت حال میں، دو پروگرام، کہتے ہیں، ٹویٹر اور وہ سائٹ جہاں آپ رجسٹر کرنے کی کوشش کر رہے ہیں، ایک دوسرے کے ساتھ ضروری ڈیٹا کا تبادلہ کریں، جس کے بعد آپ کو حتمی نتیجہ نظر آئے گا - کامیاب اجازت۔ " بہاؤ " کی اصطلاح اکثر پروگرامنگ میں ڈیٹا کے تبادلے کے عمل کو بیان کرنے کے لیے استعمال ہوتی ہے ۔ یہ نام بھی کہاں سے آیا؟ "بہاؤ" پروگرامنگ کے مقابلے میں دریا یا ندی سے زیادہ وابستہ ہے۔ درحقیقت، یہ بے وجہ نہیں ہے :) ایک سلسلہ، جوہر میں، ڈیٹا کا ایک متحرک ٹکڑا ہے۔ یعنی، پروگرامنگ میں، یہ پانی نہیں ہے جو ندی کے ساتھ ساتھ "بہتا" ہے، بلکہ بائٹس اور حروف کی شکل میں ڈیٹا ہوتا ہے۔ ڈیٹا سٹریم سے، ہم حصوں میں ڈیٹا حاصل کر سکتے ہیں اور اس کے ساتھ کچھ کر سکتے ہیں۔ ایک بار پھر، آئیے "پانی بہنے" کی تشبیہ استعمال کریں: آپ سوپ پکانے، آگ بجھانے یا پانی کے پھول بنانے کے لیے دریا سے پانی نکال سکتے ہیں۔ اسٹریمز کا استعمال کرتے ہوئے، آپ کسی بھی ڈیٹا سورس کے ساتھ کام کر سکتے ہیں: انٹرنیٹ، آپ کے کمپیوٹر کا فائل سسٹم، یا کچھ اور - اس سے کوئی فرق نہیں پڑتا۔ اسٹریمز ایک آفاقی ٹول ہیں۔ وہ پروگرام کو کہیں سے بھی ڈیٹا وصول کرنے کی اجازت دیتے ہیں (آنے والی اسٹریمز) اور اسے کہیں بھی بھیج سکتے ہیں۔ ان کا کام ایک ہے - ایک جگہ سے ڈیٹا لینا اور دوسری جگہ بھیجنا۔ ندیوں کو دو اقسام میں تقسیم کیا گیا ہے:
  1. آنے والا سلسلہ ( ان پٹ ) - ڈیٹا وصول کرنے کے لیے استعمال ہوتا ہے۔
  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);
       }
   }
}
کلاس میں InputStream(اور System.in، میں آپ کو یاد دلاتا ہوں، کلاس کا ایک مقصد ہے InputStream) ایک طریقہ ہے read()جو آپ کو ڈیٹا پڑھنے کی اجازت دیتا ہے۔ ایک مسئلہ: یہ بائٹس پڑھتا ہے ، حروف نہیں ۔ آئیے کی بورڈ سے روسی حرف "Ya" کو پڑھنے کی کوشش کریں۔ کنسول آؤٹ پٹ:
Я
208
175
10
روسی حروف کمپیوٹر کی میموری میں 2 بائٹس لیتے ہیں (انگریزی حروف کے برعکس، جو صرف 1 لیتے ہیں)۔ اس معاملے میں، سٹریم سے 3 بائٹس پڑھے گئے: پہلے دو ہمارے حرف "I" کی نمائندگی کرتے ہیں، اور دوسرا لائن بریک (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'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