CodeGym /جاوا بلاگ /Random-UR /جاوا میں ان پٹ/آؤٹ پٹ۔ فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹ...
John Squirrels
سطح
San Francisco

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

گروپ میں شائع ہوا۔
"ہیلو! آج کے سبق میں، ہم جاوا ( Java I/O ) میں ان پٹ اور آؤٹ پٹ اسٹریمز کے بارے میں اپنی گفتگو جاری رکھیں گے۔ یہ اس موضوع پر پہلا سبق نہیں ہے، اور یہ یقینی طور پر آخری نہیں ہوگا :) جاوا میں ان پٹ/آؤٹ پٹ۔  فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹریم، اور بفرڈ ان پٹ اسٹریم کلاسز - 1جیسا کہ ایسا ہوتا ہے، جاوا لینگویج 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کا مخالف مقصد ہے - فائل سے بائٹس پڑھنا۔ بالکل اسی طرح 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"
جاوا میں ان پٹ/آؤٹ پٹ۔  فائل ان پٹ اسٹریم، فائل آؤٹ پٹ اسٹریم، اور بفرڈ ان پٹ اسٹریم کلاسز - 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آبجیکٹ بنایا۔ 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 کلاسز کا مطالعہ جاری رکھیں گے — جلد ملیں گے!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION