CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ ان پٽ / آئوٽ. FileInputStream، FileOutputStream، ۽...
John Squirrels
سطح
San Francisco

جاوا ۾ ان پٽ / آئوٽ. FileInputStream، FileOutputStream، ۽ BufferedInputStream ڪلاس

گروپ ۾ شايع ٿيل
"هاءِ! اڄ جي سبق ۾، اسان جاوا ( Java I/O ) ۾ ان پٽ ۽ آئوٽ اسٽريمز جي باري ۾ اسان جي گفتگو جاري رکنداسين . هي هن موضوع تي پهريون سبق نه آهي، ۽ اهو يقيناً آخري نه هوندو :) جاوا ۾ ان پٽ / آئوٽ.  FileInputStream، FileOutputStream، ۽ BufferedInputStream ڪلاسز - 1جيئن ته . ائين ٿئي ٿو، جاوا ٻولي I/O سان ڪم ڪرڻ جا ڪيترائي طريقا مهيا ڪري ٿي. اتي ڪجھ طبقا آھن جيڪي ھن فنڪشنلٽي کي لاڳو ڪندا آھن، تنھنڪري اسان انھن کي ڪيترن ئي سبقن ۾ ورهايو آھي - تنھنڪري توھان شروع کان ئي پريشان نه ٿيندا :) ماضي ۾ سبق، اسان 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 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 آهي. ڪوشش ڪريو ڪوڊ هلائڻ جي ڪوشش ڪريو مٿي ڏنل مثال کان قطار ۾ ڪيترائي ڀيرا. پوءِ فائل ۾ ڏسو ۽ ھن سوال جو جواب ڏيو: ان ۾ ڪيتريون لائينون آھن؟ فقط ھڪ. پر توهان ڪيترائي ڀيرا ڪوڊ ورتا. اهو ظاهر ٿئي ٿو ته ڊيٽا هر وقت اوور رائٽ ڪئي وئي آهي - پراڻي کي نئين سان تبديل ڪيو ويو آهي. اسان ڇا ڪريون جيڪڏهن اهو اسان کي مناسب ناهي ۽ اسان کي فائل ۾ ترتيب سان لکڻ جي ضرورت آهي؟ ڇا جيڪڏهن اسان چاهيون ٿا ته اسان جو سلام لکڻ لاءِ هڪ فائل تي ٽي ڀيرا قطار ۾؟ اهو سڀ ڪجهه بلڪل سادو آهي. جيئن ته ٻولي اهو نه ٿو ڄاڻي سگهي ته اسان کي هر معاملي ۾ ڪهڙي رويي جي ضرورت آهي، contrucutor 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 ڪلاس استعمال ڪرڻ وقت ھن خصوصيت جي باري ۾ نه وساريو. هڪ وقت هو جڏهن آئون ڪمن تي ڪلاڪ گذاريندو هوس، ڪلاڪن تائين منهنجي دماغ کي ريڪ ڪندي، اهو سمجهڻ جي ڪوشش ڪري رهيو هو ته منهنجو ڊيٽا فائلن مان ڪيئن غائب ٿي رهيو آهي :) ۽ يقينا، جيئن ٻين 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، FileOutputStream، ۽ BufferedInputStream ڪلاس - 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 ڪلاس

مان سمجهان ٿو، ماضي جي سبقن جي ڄاڻ ڏني وئي، توهان آساني سان چئي سگهو ٿا ته اسان کي طبقي جي ضرورت ڇو آهي 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