"हाय! आज के पाठ में, हम जावा ( जावा 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!
लेकिन यहाँ एक अति सूक्ष्म अंतर है। उपरोक्त उदाहरण से कोड को लगातार कई बार चलाने का प्रयास करें। फिर फ़ाइल को देखें और इस प्रश्न का उत्तर दें: इसमें कितनी पंक्तियाँ हैं? बस एक ठो। लेकिन आपने कई बार कोड चलाया। यह पता चला है कि हर बार डेटा अधिलेखित हो जाता है - पुराने को नए द्वारा बदल दिया जाता है। अगर यह हमें शोभा नहीं देता है और हमें फ़ाइल में क्रमिक रूप से लिखने की आवश्यकता है तो हम क्या करते हैं? क्या होगा यदि हम लगातार तीन बार फाइल में अपना ग्रीटिंग लिखना चाहते हैं? यह सब बहुत आसान है। चूंकि भाषा यह नहीं जान सकती है कि प्रत्येक मामले में हमें किस व्यवहार की आवश्यकता है, इसलिए 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
:
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 कक्षाओं का अध्ययन करना जारी रखेंगे — जल्द ही मिलते हैं!
GO TO FULL VERSION