سلام! اڄ جي ليڪچر کي ٻن حصن ۾ ورهايو ويندو. اسان ڪجھ پراڻن عنوانن کي ورجائينداسون جن تي اسان اڳي ئي ڇنڊڇاڻ ڪري چڪا آهيون، ۽ ڪجهه نئين خاصيتن تي نظر وجهون ٿا :) اچو ته پهرين سان شروع ڪريون. ورجائي سکيا جي ماءُ آهي :) توهان اڳ ۾ ئي اهڙي ڪلاس استعمال ڪري چڪا آهيو
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' (۽ عام طور تي - Buffered Anything)، بفر ٿيل ڪلاس استعمال ڪيا ويندا آهن ڪارڪردگي کي بهتر ڪرڻ لاءِ. ڊيٽا جي ذريعن تائين رسائي (فائل، ڪنسول، انٽرنيٽ تي وسيلا) ڪارڪردگي جي لحاظ کان بلڪه قيمتي آپريشن آهي. تنهن ڪري، اهڙين ڪالن جي تعداد کي گهٽائڻ لاء، 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
يقينا، BufferedReader
اهو هڪ تمام لچڪدار ميڪانيزم آهي ۽ توهان کي ڪم ڪرڻ جي اجازت ڏئي ٿو نه رڳو ڪيبورڊ سان. توهان ڊيٽا پڙهي سگهو ٿا، مثال طور، انٽرنيٽ تان سڌو سنئون گهربل URL کي پڙهندڙ ڏانهن منتقل ڪندي:
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"));
/*Сохраним текущее 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
جيڪي اسان تقريبن هر سبق ۾ استعمال ڪيون آهن :) توهان کي ايندڙ ليڪچرن ۾ ملنداسين!
GO TO FULL VERSION