سلام! اڄ جي ليڪچر ۾ اسان جاوا ۾ ان پٽ ۽ آئوٽ پُٽ اسٽريمز جي باري ۾ گفتگو جاري رکنداسين، يا جاوا I/O (“input-output”) مختصر لاءِ. هي هن موضوع تي پهريون ليڪچر نه آهي، ۽ اهو آخري نه هوندو :) اهو صرف ائين ٿئي ٿو ته Java هڪ ٻولي طور ان پٽ/آئوٽ پٽ سان ڪم ڪرڻ جا ڪيترائي موقعا فراهم ڪري ٿي. اتي تمام گھڻا ڪلاس آھن جيڪي ھن فنڪشنلٽي کي لاڳو ڪن ٿا، تنھنڪري اسان انھن کي ڪيترن ئي ليڪچرن ۾ ورهايو آھي ته جيئن توھان اول ۾ پريشان نه ٿيو :) پوئين ليڪچرن ۾ اسان BufferedReader تي ھٿ ڪيو ، گڏوگڏ خلاصو ڪلاس InputStream ۽ OutputStream ۽ ڪيترائي. اولاد. اڄ اسين 3 نون طبقن تي نظر ڪنداسين: FileInputStream ، FileOutputStream ۽ BufferedInputStream .
FileOutputStream ڪلاس
FileOutputStream ڪلاس جو بنيادي مقصد ھڪڙي فائل تي بائيٽ لکڻ آھي. ڪجھ به پيچيده ناهي :) FileOutputStream خلاصي OutputStream طبقي جي عملن مان هڪ آهي . ڪنسٽرڪٽر ۾، هن ڪلاس جون شيون يا ته ٽارگيٽ فائل ڏانهن رستو وٺن ٿيون (جنهن تي بائيٽ لکڻ گهرجن) يا ڪلاس جو ڪو اعتراضFile
. اچو ته ٻنهي مثالن کي ڏسو:
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\Username\\Desktop\\test.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
جڏهن هڪ شئي ٺاهي، File
اسان تعمير ڪندڙ ۾ اهو رستو بيان ڪيو آهي جتي اهو واقع هجڻ گهرجي. ان کي اڳ ۾ پيدا ڪرڻ جي ڪا ضرورت ناهي: جيڪڏهن اهو موجود ناهي، اهو پروگرام پاڻ ٺاهيندو. توهان بغير ڪنهن اضافي شئي ٺاهڻ جي ڪري سگهو ٿا ۽ صرف پتي سان هڪ اسٽرنگ پاس ڪريو:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt");
String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
ٻنهي صورتن ۾ نتيجو ساڳيو ٿيندو. اسان پنهنجي فائل کي کوليو ۽ اتي ڏسي سگهون ٿا:
Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
تنهن هوندي به، هتي هڪ caveat آهي. ڪوشش ڪريو مٿي ڏنل مثال مان ڪوڊ کي لڳاتار ڪيترائي ڀيرا، ۽ پوءِ فائل ڏسو ۽ ان سوال جو جواب ڏيو: توھان ان ۾ لکيل ڪيتريون لائينون ڏسو ٿا؟ فقط ھڪ. پر توهان ڪيترائي ڀيرا ڪوڊ ورتا. بهرحال، اهو ظاهر ٿئي ٿو ته ڊيٽا هر وقت اوور رائٽ ڪئي وئي، پراڻين کي تبديل ڪندي. ڇا جيڪڏهن اسان هن سان مطمئن نه آهيون ۽ ترتيب واري رڪارڊنگ جي ضرورت آهي؟ ڇا جيڪڏهن اسان چاهيون ٿا ته اسان جو سلام لکڻ لاءِ هڪ فائل تي ٽي ڀيرا قطار ۾؟ هتي سڀ ڪجھ سادو آهي. جيئن ته ٻولي پاڻ نه ٿو ڄاڻي سگهي ته اسان کي هر صورت ۾ ڪهڙي قسم جي رويي جي ضرورت آهي، FileOutputStream
توهان هڪ اضافي پيٽرولر کي تعمير ڪندڙ ڏانهن منتقل ڪري سگهو ٿا - boolean append
. جيڪڏهن ان جي قيمت صحيح آهي ، ڊيٽا کي فائل جي آخر تائين لکيو ويندو. جيڪڏهن غلط آهي (۽ ڊفالٽ قدر غلط آهي )، پراڻي ڊيٽا ختم ٿي ويندي ۽ نئين ڊيٽا لکي ويندي. اچو ته اسان جي تبديل ٿيل ڪوڊ کي ٽي دفعا جانچون ۽ هلون:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt", true);
String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!\r\n";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
فائل ۾ نتيجو:
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
ٻي ڳالهه! I/O ڪلاس استعمال ڪرڻ وقت ھن خصوصيت کي ذهن ۾ رکو. هڪ دفعي، مون کي ڪمن تي ڪلاڪن لاءِ ويهڻو پيو ته اهو سمجهڻ لاءِ ته منهنجو پراڻو ڊيٽا فائلن مان ڪٿي ويو :) ۽ يقيناً، جيئن ٻين I/O ڪلاسن جي صورت ۾، وسيلن کي جاري ڪرڻ جي باري ۾ نه وساريو close()
.
FileInputStream ڪلاس
ڪلاس جوFileInputStream
مخالف مقصد آهي - فائل مان بائيٽ پڙهڻ. FileOutputStream
وراثت وانگر OutputStream
، هي طبقو خلاصي طبقي مان نڪتل آهي InputStream
. اچو ته اسان جي متن ۾ متن جون ڪيتريون ئي لائينون لکون “ test.txt ”:
«So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters»
اهو آهي جيڪو استعمال ڪندي فائل مان ڊيٽا پڙهڻ جو عمل FileInputStream
:
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");
int i;
while((i=fileInputStream.read())!= -1){
System.out.print((char)i);
}
}
}
اسان فائل مان ھڪڙو بائيٽ پڙھون ٿا، پڙھيل بائيٽ کي ڪردارن ۾ تبديل ڪريو ۽ انھن کي ڪنسول ڏانھن ٻاھر موڪليو. ۽ هتي ڪنسول ۾ نتيجو آهي:
So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters
BufferedInputStream ڪلاس
مان سمجهان ٿو، اڳئين ليڪچرن مان ڄاڻ ڏني وئي، توهان آساني سان ٻڌائي سگهو ٿا ته ڪلاس جي ضرورت ڇو آهيBufferedInputStream
۽ ان جا ڪهڙا فائدا آهن FileInputStream
:) اسان اڳ ۾ ئي بفر ٿيل اسٽريمز سان مليا آهيون، تنهنڪري پڙهڻ جاري رکڻ کان اڳ اندازو لڳائڻ (يا ياد رکڻ) جي ڪوشش ڪريو :) بفر ٿيل اسٽريمز I/O کي بهتر ڪرڻ لاءِ بنيادي طور تي گهربل آهن. ڊيٽا جي ماخذ تائين رسائي، جهڙوڪ فائل مان پڙهڻ، هڪ ڪارڪردگي-گھڻي آپريشن آهي. ۽ هر وقت هڪ بائيٽ پڙهڻ لاءِ فائل تائين رسائي فضول آهي. تنهن ڪري، BufferedInputStream
اهو ڊيٽا پڙهي ٿو هڪ وقت ۾ هڪ بائيٽ نه، پر بلاڪ ۾ ۽ عارضي طور تي انهن کي خاص بفر ۾ محفوظ ڪري ٿو. هي اسان کي اجازت ڏئي ٿو ته پروگرام جي آپريشن کي بهتر ڪرڻ جي ذريعي فائل تائين رسائي جي تعداد کي گهٽائڻ سان. اچو ته ڏسو ته اهو ڇا ٿو لڳي:
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, 200);
int i;
while((i = bufferedInputStream.read())!= -1){
System.out.print((char)i);
}
}
}
هتي اسان هڪ اعتراض ٺاهيو آهي BufferedInputStream
. اهو هڪ اعتراض يا ان جي جانشين مان ڪنهن کي انپٽ طور قبول ڪري ٿو InputStream
، تنهنڪري پوئين هڪ FileInputStream
ڪندو. اهو بفر سائيز کي بائيٽ ۾ اضافي پيٽرولر طور وٺندو آهي. هاڻي، هن جي مهرباني، فائل مان ڊيٽا پڙهي ويندي هڪ وقت ۾ هڪ بائيٽ نه، پر هڪ وقت ۾ 200! تصور ڪريو ته اسان فائلن جي رسائي جو تعداد ڪيترو گھٽايو آھي. FileInputStream
ڪارڪردگي جو مقابلو ڪرڻ لاءِ، توھان ڪجھ وڏي ٽيڪسٽ فائل وٺي سگھوٿا ڪيترائي ميگا بائيٽ سائيز ۾ ۽ موازنہ ڪري سگھوٿا ته ان کي پڙھڻ ۾ ڪيترو وقت لڳندو آھي ۽ ان کي استعمال ڪندي مليس سيڪنڊن ۾ ڪنسول ڏانھن ٻاھر ڪڍو BufferedInputStream
. هتي ڪوڊ جا ٻئي مثال آهن:
public class Main {
public static void main(String[] args) throws IOException {
Date date = new Date();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\textBook.rtf");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
int i;
while((i = bufferedInputStream.read())!= -1){
System.out.print((char)i);
}
Date date1 = new Date();
System.out.println((date1.getTime() - date.getTime()));
}
}
public class Main {
public static void main(String[] args) throws IOException {
Date date = new Date();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\26951280.rtf");
int i;
while((i = fileInputStream.read())!= -1){
System.out.print((char)i);
}
Date date1 = new Date();
System.out.println((date1.getTime() - date.getTime()));
}
}
جڏهن منهنجي ڪمپيوٽر تي هڪ 1.5 MB فائل پڙهي، FileInputStream
اهو ڪم ~ 3500 ملي سيڪنڊن ۾ ڪيو، پر هتي BufferedInputStream
اهو ڪم ~ 1700 ملي سيڪنڊن ۾ ڪيو. جئين توهان ڏسي سگهو ٿا، بفر ٿيل وهڪرو پروگرام جي ڪارڪردگي کي 2 ڀيرا بهتر ڪيو! :) اسان I/O ڪلاس جو مطالعو جاري رکنداسين - پوءِ ملنداسين!
GO TO FULL VERSION