JavaRush /جاوا بلاگ /Random-UR /BufferedReader اور InputStreamReader کلاسوں کے ساتھ کام ک...

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

گروپ میں شائع ہوا۔
ہیلو! آج کے لیکچر کو دو حصوں میں تقسیم کیا جائے گا۔ ہم کچھ پرانے عنوانات کو دہرائیں گے جن پر ہم پہلے ہی چھو چکے ہیں، اور کچھ نئی خصوصیات دیکھیں گے :) BuffreredReader اور InputStreamReader کلاسز کے ساتھ کام کرنے کی مشق کریں - 1آئیے پہلے سے شروع کرتے ہیں۔ تکرار سیکھنے کی ماں ہے :) آپ پہلے ہی ایسی کلاس استعمال کر چکے ہیں 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);
       }
   }
}
اگر ہم اس کوڈ کو چلاتے ہیں اور کنسول میں حرف "Y" داخل کرتے ہیں تو آؤٹ پٹ اس طرح ہوگا:

Й
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);
       }
   }
}
اگر ہم کنسول میں ایک ہی حرف "Y" داخل کرتے ہیں، تو اس بار نتیجہ مختلف ہوگا:

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

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

       char x = 1049;
       System.out.println(x);
   }
}
کنسول آؤٹ پٹ:

Й
ٹھیک ہے، جیسا کہ BufferedReader'a (اور عام طور پر - BufferedAnything)، کارکردگی کو بہتر بنانے کے لیے بفر شدہ کلاسز کا استعمال کیا جاتا ہے۔ ڈیٹا سورس تک رسائی (فائل، کنسول، انٹرنیٹ پر وسائل) کارکردگی کے لحاظ سے ایک مہنگا آپریشن ہے۔ اس لیے، ایسی کالوں کی تعداد کو کم کرنے کے لیے، BufferedReaderیہ ایک خاص بفر میں ڈیٹا کو پڑھتا اور جمع کرتا ہے، جہاں سے ہم بعد میں اسے وصول کر سکتے ہیں۔ نتیجے کے طور پر، ڈیٹا سورس پر کالز کی تعداد کئی گنا یا دسیوں گنا کم ہو جاتی ہے! BufferedReader'a اور باقاعدہ پر اس کا فائدہ ' کی ایک اور اضافی خصوصیت 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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
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"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
نتیجے کے طور پر، پہلی لائن ٹیکسٹ فائل میں لکھی جائے گی، اور دوسری کنسول میں آؤٹ پٹ ہوگی :) آپ اس کوڈ کو اپنے IDE میں کاپی کر کے اسے چلا سکتے ہیں۔ ٹیکسٹ فائل کو کھولنے سے، آپ دیکھیں گے کہ مطلوبہ سطر وہاں کامیابی سے لکھی گئی ہے :) اس سے لیکچر ختم ہوتا ہے۔ آج ہم نے اسٹریمز اور قارئین کے ساتھ کام کرنے کا طریقہ یاد کیا، یاد کیا کہ وہ کس طرح ایک دوسرے سے مختلف ہیں اور نئی خصوصیات کے بارے میں سیکھا System.outجو ہم نے تقریباً ہر اسباق میں استعمال کیا تھا :) اگلے لیکچرز میں ملتے ہیں!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION