CodeGym /جاوا بلاگ /Random-UR /BuffreredReader اور InputStreamReader کلاسوں کے ساتھ کام ...
John Squirrels
سطح
San Francisco

BuffreredReader اور InputStreamReader کلاسوں کے ساتھ کام کرنے کی مشق کریں۔

گروپ میں شائع ہوا۔
ہائے! آج کے سبق کو سہولت کے لیے دو حصوں میں تقسیم کیا جائے گا۔ ہم کچھ پرانے عنوانات کو دہرائیں گے جنہیں ہم نے پہلے چھو لیا تھا، اور ہم کچھ نئی خصوصیات پر غور کریں گے :) آئیے پہلے سے شروع کرتے ہیں۔ BufferedReaderآپ پہلے ہی کئی بار کی طرح کلاس کر چکے ہیں ۔ مجھے امید ہے کہ آپ کے پاس اس بیان کو بھولنے کا وقت نہیں ہے:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
مزید پڑھنے سے پہلے، یہ یاد کرنے کی کوشش کریں کہ ہر جزو — System.in, InputStreamReader, BufferedReader— کس چیز کے لیے ذمہ دار ہے اور اس کی ضرورت کیوں ہے۔ تمہیں یاد ہے؟ اگر نہیں، تو کوئی فکر نہیں۔ :) اگر آپ کچھ بھول گئے ہیں، تو اس سبق کو دوبارہ پڑھیں ، جو ریڈر کلاسز کے لیے وقف ہے۔ ہم مختصراً یاد کریں گے کہ ان میں سے ہر ایک کیا کر سکتا ہے۔ System.in- یہ کی بورڈ سے ڈیٹا حاصل کرنے کا سلسلہ ہے۔  اصولی طور پر، متن کو پڑھنے کے لیے درکار منطق کو لاگو کرنے کے لیے صرف یہ کافی ہوگا۔ لیکن، جیسا کہ آپ کو یاد ہوگا، System.inصرف بائٹس پڑھ سکتے ہیں، حروف کو نہیں:
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
اگر ہم اس کوڈ پر عمل کرتے ہیں اور سیریلک حرف "Й" درج کرتے ہیں، تو آؤٹ پٹ یہ ہوگا:

Й
208
153
10 
سیریلک حروف میموری میں 2 بائٹس پر قبضہ کرتے ہیں، اور وہ اسکرین پر ظاہر ہوتے ہیں۔ نمبر 10 لائن فیڈ کریکٹر کی اعشاریہ نمائندگی ہے، یعنی Enter دبانے سے۔ بائٹس پڑھنا ایک خوشی کی بات ہے، لہذا استعمال کرنا System.inزیادہ آسان نہیں ہے۔ سیریلک (اور دیگر) حروف کو صحیح طریقے سے پڑھنے کے لیے، ہم 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);
       }
   }
}
ہم ایک ہی حرف "Й" درج کرتے ہیں، لیکن اس بار نتیجہ مختلف ہے:

Й 
1049 
10
InputStreamReaderدو بائٹس (208 اور 153) کو سنگل نمبر 1049 میں تبدیل کیا۔ حروف کو پڑھنے کا یہی مطلب ہے۔ 1049 سیریلک حرف "Й" سے مماثل ہے۔ ہم آسانی سے اپنے آپ کو قائل کر سکتے ہیں کہ یہ سچ ہے:
public class Main {

   public static void main(String[] args) throws IOException {
       char x = 1049;
       System.out.println(x);
   }
}
کنسول آؤٹ پٹ:

Й
اور جیسا کہ forBufferedReader(اور عام طور پر، BufferedAnythingYouWant)، بفر شدہ کلاسیں کارکردگی کو بہتر بنانے کے لیے استعمال ہوتی ہیں۔ کارکردگی کے لحاظ سے ڈیٹا سورس (فائل، کنسول، ویب ریسورس) تک رسائی کافی مہنگی ہے۔ لہذا، رسائی کی تعداد کو کم کرنے کے لیے، BufferedReaderایک خاص بفر میں ڈیٹا کو پڑھتا اور جمع کرتا ہے، اور ہم اسے وہاں سے حاصل کرتے ہیں۔ نتیجے کے طور پر، اعداد و شمار کے ذریعہ تک رسائی حاصل کرنے کی تعداد میں کمی کی جاتی ہے - ممکنہ طور پر شدت کے کئی آرڈرز سے! اس کی ایک اور BufferedReaderخصوصیت اور عام پر اس کا فائدہ InputStreamReader، انتہائی مددگار 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 ("The user entered the following text:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader is faster than InputStreamReader alone 
The user entered the following text: 
BufferedReader+InputStreamReader is faster than InputStreamReader alone
BuffreredReader اور InputStreamReader کلاسز - 2 کے ساتھ کام کرنے کی مشق کریں۔بالکل، BufferedReaderبہت لچکدار ہے. آپ کی بورڈ کے ساتھ کام کرنے تک محدود نہیں ہیں۔ مثال کے طور پر، آپ ویب سے براہ راست ڈیٹا پڑھ سکتے ہیں، بس مطلوبہ یو آر ایل کسی ریڈر کو دے کر:
public class URLReader {

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

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
آپ فائل کا راستہ پاس کرکے فائل سے ڈیٹا پڑھ سکتے ہیں:
public class Main {

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

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

System.out کو تبدیل کرنا

اب آئیے ایک دلچسپ قابلیت پر ایک نظر ڈالتے ہیں جسے ہم نے پہلے نہیں چھوا تھا۔ جیسا کہ آپ کو یقیناً یاد ہوگا، Systemکلاس میں دو جامد فیلڈز ہیں — System.inاور  System.out. یہ جڑواں بھائی سٹریم آبجیکٹ ہیں۔ System.inایک InputStream. اور System.out ایک ہے PrintStream۔ ابھی، ہم کے بارے میں بات کریں گے  System.out. اگر ہم Systemکلاس کے سورس کوڈ میں داخل ہوتے ہیں تو ہم یہ دیکھتے ہیں:
public final class System {
……………...
public final static PrintStream out = null;
 …………
}
اس طرح،  کلاس System.out  کا محض ایک عام جامد متغیر ہےSystem ۔ اس میں کوئی جادو نہیں ہے :) outمتغیر ایک حوالہ ہے PrintStream۔ یہاں ایک دلچسپ سوال ہے: جب System.out.println()پھانسی دی جاتی ہے، تو بالکل آؤٹ پٹ کنسول میں کیوں جاتا ہے اور کہیں اور نہیں؟ اور کیا اسے کسی طرح تبدیل کیا جا سکتا ہے؟ مثال کے طور پر، فرض کریں کہ ہم کنسول سے ڈیٹا پڑھنا چاہتے ہیں اور اسے ٹیکسٹ فائل میں لکھنا چاہتے ہیں۔ کیا  System.outاضافی ریڈر اور رائٹر کلاسز کے بجائے کسی طرح اس پر عمل درآمد ممکن ہے؟ درحقیقت، یہ ہے :) اور ہم یہ کر سکتے ہیں حالانکہ System.outمتغیر کو موڈیفائر کے ساتھ نشان زد کیا گیا ہے final!  BuffreredReader اور InputStreamReader کلاسز - 3 کے ساتھ کام کرنے کی مشق کریں۔تو ہمیں ایسا کرنے کی کیا ضرورت ہے؟ سب سے پہلے، ہمیں PrintStreamموجودہ کو تبدیل کرنے کے لیے ایک نئی چیز کی ضرورت ہے۔ موجودہ آبجیکٹ، Systemکلاس میں بطور ڈیفالٹ سیٹ کیا گیا ہے، ہمارے مقاصد کو پورا نہیں کرتا: یہ کنسول کی طرف اشارہ کرتا ہے۔ آپ کو ایک نئی فائل بنانے کی ضرورت ہے جو ٹیکسٹ فائل کی طرف اشارہ کرے — ہمارے ڈیٹا کے لیے "منزل"۔ دوسرا، ہمیں یہ سمجھنے کی ضرورت ہے کہ متغیر کو نئی قدر کیسے تفویض کی جائے System.out۔ آپ سادہ اسائنمنٹ آپریٹر استعمال نہیں کر سکتے، کیونکہ متغیر نشان زد ہے final۔ آئیے آخر سے پیچھے کی طرف کام کریں۔ جیسا کہ یہ ہوتا ہے، Systemکلاس کے پاس وہ طریقہ ہے جس کی ہمیں ضرورت ہے: setOut()۔ یہ ایک PrintStreamآبجیکٹ لیتا ہے اور اسے آؤٹ پٹ کی منزل کے طور پر سیٹ کرتا ہے۔ بس یہی ہمیں چاہیے! PrintStreamجو کچھ باقی رہ جاتا ہے وہ ایک چیز بنانا ہے ۔ یہ بھی آسان ہے:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
مکمل کوڈ اس طرح نظر آئے گا:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later
       we can switch back to console output */

       PrintStream console = System.out;
       // Assign a new value to System.out
       System.setOut(filePrintStream);
       System.out.println("This line will be written to the text file");

       // Restore the old value of System.out
       System.setOut(console);
       System.out.println("But this line will be output to the console!");
   }
}
نتیجے کے طور پر، پہلی سٹرنگ ٹیکسٹ فائل میں لکھی جاتی ہے، اور دوسری کنسول میں ظاہر ہوتی ہے :) آپ اس کوڈ کو اپنے IDE میں کاپی کر کے چلا سکتے ہیں۔ ٹیکسٹ فائل کھولیں اور آپ دیکھیں گے کہ سٹرنگ وہاں کامیابی سے لکھی گئی ہے :) اس کے ساتھ ہی ہمارا سبق اختتام کو پہنچ گیا ہے۔ آج ہم نے یاد کیا کہ اسٹریمز اور ریڈرز کے ساتھ کیسے کام کرنا ہے۔ ہم نے یاد کیا کہ وہ کس طرح ایک دوسرے سے مختلف ہیں اور کچھ نئی صلاحیتوں کے بارے میں سیکھا System.out، جو ہم نے تقریباً ہر سبق میں استعمال کیا ہے :) اگلے اسباق تک!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION