JavaRush /جاوا بلاگ /Random-UR /I/O جاوا میں۔ کلاسز فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹریم...

I/O جاوا میں۔ کلاسز فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹریم، بفرڈ ان پٹ اسٹریم

گروپ میں شائع ہوا۔
ہیلو! آج کے لیکچر میں ہم جاوا میں ان پٹ اور آؤٹ پٹ اسٹریمز یا جاوا I/O ("ان پٹ آؤٹ پٹ") کے بارے میں مختصر گفتگو جاری رکھیں گے ۔ اس موضوع پر یہ پہلا لیکچر نہیں ہے، اور یہ آخری نہیں ہوگا :) ایسا ہی ہوتا ہے کہ جاوا بطور زبان ان پٹ/آؤٹ پٹ کے ساتھ کام کرنے کے بہت سے مواقع فراہم کرتا ہے۔ بہت ساری کلاسیں ہیں جو اس فعالیت کو لاگو کرتی ہیں، اس لیے ہم نے انہیں کئی لیکچرز میں تقسیم کیا تاکہ آپ پہلے ہی الجھن میں نہ پڑیں :) I/O جاوا میں۔  کلاسز فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹریم، بفرڈ ان پٹ اسٹریم - 1پچھلے لیکچرز میں ہم نے 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 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 — лучший сайт для тех, кто хочет стать программистом!
تاہم، یہاں ایک انتباہ ہے. اوپر دی گئی مثال سے کوڈ کو لگاتار کئی بار چلانے کی کوشش کریں، اور پھر فائل کو دیکھیں اور سوال کا جواب دیں: آپ کو اس میں کتنی لائنیں لکھی ہوئی نظر آتی ہیں؟ صرف ایک. لیکن آپ نے کوڈ کو کئی بار چلایا۔ تاہم، یہ پتہ چلتا ہے کہ ڈیٹا کو ہر بار اوور رائٹ کیا گیا تھا، پرانے کی جگہ لے لی گئی تھی۔ کیا ہوگا اگر ہم اس سے مطمئن نہیں ہیں اور ترتیب وار ریکارڈنگ کی ضرورت ہے؟ اگر ہم ایک فائل پر لگاتار تین بار اپنا سلام لکھنا چاہتے ہیں تو کیا ہوگا؟ یہاں سب کچھ آسان ہے۔ چونکہ زبان خود نہیں جان سکتی کہ ہمیں ہر معاملے میں کس قسم کے رویے کی ضرورت ہے، 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مخالف مقصد ہے - فائل سے بائٹس پڑھنا۔ FileOutputStreaminherits کی طرح 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»
I/O جاوا میں۔  کلاسز فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹریم، بفرڈ ان پٹ اسٹریم - 2 اس کا استعمال کرتے ہوئے فائل سے ڈیٹا پڑھنے کا عمل یہ ہے 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۔ یہ کسی چیز یا اس کے جانشینوں میں سے کسی کو بطور input قبول کرتا ہے 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 کلاسز کا مطالعہ جاری رکھیں گے - جلد ملیں گے!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION