"ہیلو! آج کے سبق میں، ہم جاوا ( Java I/O ) میں ان پٹ اور آؤٹ پٹ اسٹریمز کے بارے میں اپنی گفتگو جاری رکھیں گے۔ یہ اس موضوع پر پہلا سبق نہیں ہے، اور یہ یقینی طور پر آخری نہیں ہوگا :)
جیسا کہ ایسا ہوتا ہے، جاوا لینگویج I/O کے ساتھ کام کرنے کے بہت سے طریقے فراہم کرتی ہے۔ اس فعالیت کو نافذ کرنے والی بہت سی کلاسیں ہیں، لہذا ہم نے انہیں کئی اسباق میں تقسیم کیا ہے — تاکہ آپ شروع سے ہی الجھن میں نہ پڑیں :) ماضی میں اسباق، ہم نے
یہاں یہ استعمال کرتے ہوئے کسی فائل سے ڈیٹا کو پڑھنے کی طرح لگتا ہے

BufferedReader
اس کے ساتھ ساتھ InputStream
اور خلاصہ کلاسوں اور کئی اولادوں کو چھوا OutputStream
۔ آج ہم 3 نئی کلاسوں پر غور کریں گے: FileInputStream
, FileOutputStream
, اور BufferedInputStream
.
فائل آؤٹ پٹ اسٹریم کلاس
کلاس کا بنیادی مقصد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 CodeGym — The best site for would-be programmers!";
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 CodeGym — The best site for would-be programmers!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
دونوں صورتوں میں نتیجہ ایک ہی نکلے گا۔ ہم اپنی فائل کھول سکتے ہیں اور وہاں درج ذیل دیکھ سکتے ہیں:
Hi! Welcome to CodeGym — The best site for would-be programmers!
لیکن یہاں ایک nuance ہے. اوپر دی گئی مثال سے کوڈ کو لگاتار کئی بار چلانے کی کوشش کریں۔ پھر فائل میں دیکھیں اور اس سوال کا جواب دیں: اس میں کتنی لائنیں ہیں؟ صرف ایک. لیکن آپ نے کوڈ کو کئی بار چلایا۔ یہ پتہ چلتا ہے کہ ہر بار ڈیٹا کو اوور رائٹ کیا جاتا ہے - پرانے کی جگہ نیا ہوتا ہے۔ ہم کیا کریں اگر یہ ہمارے مطابق نہیں ہے اور ہمیں فائل میں ترتیب وار لکھنے کی ضرورت ہے؟ اگر ہم ایک فائل پر لگاتار تین بار اپنا سلام لکھنا چاہتے ہیں تو کیا ہوگا؟ یہ سب بہت آسان ہے۔ چونکہ زبان یہ نہیں جان سکتی کہ ہمیں ہر معاملے میں کس طرز عمل کی ضرورت ہے، 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 CodeGym — The best site for would-be programmers!\r\n";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
فائل کا مواد:
Hi! Welcome to CodeGym — The best site for would-be programmers!
Hi! Welcome to CodeGym — The best site for would-be programmers!
Hi! Welcome to CodeGym — The best site for would-be programmers!
اب یہ مختلف ہے! I/O کلاسز استعمال کرتے وقت اس خصوصیت کو مت بھولنا۔ close()
ایک وقت تھا جب میں کاموں میں گھنٹوں گزارتا تھا، گھنٹوں اپنے دماغ کو ریک کرتا تھا، یہ سمجھنے کی کوشش کرتا تھا کہ میرا ڈیٹا فائلوں سے کیسے غائب ہو رہا ہے :) اور بلاشبہ، بالکل اسی طرح جیسے دیگر I/O کلاسز کے ساتھ، طریقہ استعمال کرنا نہ بھولیں۔ مفت وسائل کے لئے.
فائل ان پٹ اسٹریم کلاس
اسFileInputStream
کا مخالف مقصد ہے - فائل سے بائٹس پڑھنا۔ بالکل اسی طرح FileOutputStream
inherits 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
اور اس کے مقابلے میں اس کے کیا فوائد ہیں 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 ملی سیکنڈ میں اس کا انتظام کیا۔ جیسا کہ آپ دیکھ سکتے ہیں، بفرڈ سٹریم نے کام کو بہتر بنایا، اسے آدھے حصے میں کاٹ دیا! :) ہم I/O کلاسز کا مطالعہ جاری رکھیں گے — جلد ملیں گے!
GO TO FULL VERSION