ہائے! آج کے سبق کو سہولت کے لیے دو حصوں میں تقسیم کیا جائے گا۔ ہم کچھ پرانے عنوانات کو دہرائیں گے جنہیں ہم نے پہلے چھو لیا تھا، اور ہم کچھ نئی خصوصیات پر غور کریں گے :) آئیے پہلے سے شروع کرتے ہیں۔
بالکل،
تو ہمیں ایسا کرنے کی کیا ضرورت ہے؟ سب سے پہلے، ہمیں
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

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
! 
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
، جو ہم نے تقریباً ہر سبق میں استعمال کیا ہے :) اگلے اسباق تک!
مزید پڑھنا: |
---|
GO TO FULL VERSION