CodeGym /Java Blog /अनियमित /जावा में इनपुट/आउटपुट। FileInputStream, FileOutputStream,...
John Squirrels
स्तर 41
San Francisco

जावा में इनपुट/आउटपुट। FileInputStream, FileOutputStream, और BufferedInputStream क्लासेस

अनियमित ग्रुप में प्रकाशित
"हाय! आज के पाठ में, हम जावा ( जावा I/O ) में इनपुट और आउटपुट स्ट्रीम के बारे में अपनी बातचीत जारी रखेंगे। यह इस विषय पर पहला पाठ नहीं है, और यह निश्चित रूप से अंतिम नहीं होगा :) जावा में इनपुट/आउटपुट।  FileInputStream, FileOutputStream, और BufferedInputStream क्लासेस - 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!
लेकिन यहाँ एक अति सूक्ष्म अंतर है। उपरोक्त उदाहरण से कोड को लगातार कई बार चलाने का प्रयास करें। फिर फ़ाइल को देखें और इस प्रश्न का उत्तर दें: इसमें कितनी पंक्तियाँ हैं? बस एक ठो। लेकिन आपने कई बार कोड चलाया। यह पता चला है कि हर बार डेटा अधिलेखित हो जाता है - पुराने को नए द्वारा बदल दिया जाता है। अगर यह हमें शोभा नहीं देता है और हमें फ़ाइल में क्रमिक रूप से लिखने की आवश्यकता है तो हम क्या करते हैं? क्या होगा यदि हम लगातार तीन बार फाइल में अपना ग्रीटिंग लिखना चाहते हैं? यह सब बहुत आसान है। चूंकि भाषा यह नहीं जान सकती है कि प्रत्येक मामले में हमें किस व्यवहार की आवश्यकता है, इसलिए 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 एमबी फ़ाइल पढ़ने पर, FileInputStreamकाम ~ 3500 मिलीसेकंड में पूरा हुआ, लेकिन BufferedInputStreamइसे ~ 1700 मिलीसेकंड में प्रबंधित किया गया। जैसा कि आप देख सकते हैं, बफ़र्ड स्ट्रीम ने काम को अनुकूलित किया, इसे आधे में काट दिया! :) हम I/O कक्षाओं का अध्ययन करना जारी रखेंगे — जल्द ही मिलते हैं!
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION