CodeGym /جاوا بلاگ /Random-UR /کی بورڈ سے پڑھنا: "قارئین"
John Squirrels
سطح
San Francisco

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

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

دنیا میں یہ کیسے کام کرتا ہے؟

حقیقت میں، پروگرام شاذ و نادر ہی مکمل طور پر آزاد ہوتے ہیں۔ وہ دوسرے پروگراموں، سسٹمز، انٹرنیٹ وغیرہ کے ساتھ بات چیت کرتے ہیں۔ "مواصلات" سے ہمارا بنیادی مطلب "ڈیٹا کا تبادلہ" ہے۔ یعنی وہ کچھ بیرونی ڈیٹا وصول کرتے ہیں اور اندرونی پروگرام کا ڈیٹا بھی کہیں بھیجتے ہیں۔ ڈیٹا کا تبادلہ کرنے والے پروگراموں کی مثالیں روزمرہ کی زندگی میں بہت زیادہ ہیں۔ مثال کے طور پر، بہت سی ویب سائٹس آپ کو رجسٹر کرنے کے بجائے اپنے Facebook یا 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()طریقہ ہے جو آپ کو ڈیٹا پڑھنے دیتا ہے۔ ایک مسئلہ ہے: یہ بائٹس پڑھتا ہے ، حروف نہیں ۔ صرف انگریزی حروف کا استعمال کرنا بورنگ ہے تو آئیے کی بورڈ سے چینی حرف "魚" پڑھنے کی کوشش کریں (صرف اس خط کو یہاں سے کاپی کریں اور PC پر ctrl + v یا Mac پر Command + v کا استعمال کرتے ہوئے کنسول میں پیسٹ کریں ) ۔ اس کردار کا مطلب ہے 'مچھلی'۔ کنسول آؤٹ پٹ: 233 173 154 10 یہ علامت اور بہت سے دوسرے چینی کمپیوٹر کی میموری میں 3 بائٹس پر قبضہ کرتے ہیں (لاطینی حروف کے برعکس، جو صرف 1 بائٹ پر قبضہ کرتے ہیں)۔ اس صورت میں، سٹریم سے 4 بائٹس پڑھے جاتے ہیں: پہلے تین کردار "魚" کی نمائندگی کرتے ہیں، اور دوسرے بائٹ ایک نئی لائن (Enter) کی نمائندگی کرتے ہیں۔ اس کے مطابق، System.inاس کی غیر آرائشی شکل میں ہمارے لئے ایک اختیار نہیں ہے. انسان (غیر معمولی استثناء کے ساتھ!) بائٹس کو پڑھنا نہیں جانتے۔ لیکن InputStreamReaderکلاس بچاؤ کے لئے آتا ہے! آئیے دیکھتے ہیں کہ یہ کس قسم کا جانور ہے۔
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
ہم InputStreamReaderSystem.in آبجیکٹ کو منتقل کرتے ہیں ۔ کلاس کا نام یہ کہتا ہے! ہم ایک آبجیکٹ بناتے ہیں اور اسے ایک ان پٹ اسٹریم پاس کرتے ہیں جس سے یہ ڈیٹا پڑھے گا۔ اس معاملے میں... 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