सबसे पहले, आपको जावा में स्ट्रीमिंग समझनी चाहिए क्योंकि जावा में सभी "पाठक" उस अवधारणा पर बनाए गए हैं।
फ़ाइल स्ट्रीमिंग
फ़ाइल स्ट्रीमिंग जावा में FileInputStream वस्तु द्वारा किया जाता है।
// it reads one byte at a time and stores into the 'byt' variable
int byt;
while((byt = fileInputStream.read()) != -1) {
fileOutputStream.write(byt);
}
यह ऑब्जेक्ट वास्तव में एक समय में एक बाइट (8-बिट्स) पढ़ता है और इसे दी गई फ़ाइल में लिखता है।
एक व्यावहारिक अनुप्रयोग होगा, जब आप कच्चे बाइनरी/डेटा फ़ाइलों जैसे छवियों या ऑडियो फ़ाइलों के साथ काम करेंगे (ऑडियो फ़ाइलों के लिए FileInputStream के बजाय AudioInputStream का उपयोग करें)। दूसरी ओर टेक्स्ट फ़ाइलों के लिए, यह बहुत ही असुविधाजनक और धीमी है, क्योंकि एक समय में बाइट के माध्यम से लूपिंग, फिर कुछ प्रसंस्करण और बाइट बैक स्टोर करना कठिन और समय लेने वाला है।
तुम भी, पाठ फ़ाइल के (यदि पात्रों लैटिन या चीनी, आदि कर रहे हैं), कि तुम, साथ काम कर रहे कुशल एन्कोडिंग और डिकोडिंग के लिए अन्यथा, कार्यक्रम होगा चरित्र सेट उपलब्ध कराने की आवश्यकता कुछ झिल्ली को डीकोड करें और एन्कोड करें और आप अपनी टेक्स्ट फ़ाइल में लिखे गए अजीब प्रतीकों का पूरा समूह देखेंगे।
फ़ाइल पढ़ना
यह सिर्फ चरित्र सेट समर्थन के साथ "फाइल स्ट्रीमिंग" कह का एक आधुनिक तरीका है।
फ़ाइल रीडर कक्षा विशेष रूप से टेक्स्ट फ़ाइलों से निपटने के लिए डिज़ाइन की गई है। जैसा कि आप पहले देखते हैं, फ़ाइल स्ट्रीमिंग कच्चे बाइनरी डेटा से निपटने के लिए सबसे अच्छी है, लेकिन पाठ के लिए, यह कुशल नहीं है।
तो जावा लोग पाठ फ़ाइलों के साथ विशेष रूप से निपटने के लिए, FileReader वर्ग गयी। यह एक बार में 2 बाइट्स पढ़ता (FileInputStream के ऊपर एक विशाल सुधार !! मैं कहना चाहता हूँ अभी भी बेहतर विकल्प तो एक बाइट स्ट्रीमिंग।)
तो आपरेशन के रूप में है,
int c;
while ((c = fileReader.read()) != -1) { // some logic }
कृपया ध्यान दें , दोनों उदाहरण इनपुट फ़ाइल से प्राप्त मूल्य को संग्रहीत करने के लिए एक पूर्णांक चर का उपयोग करते हैं।
एकमात्र फायदा यह है कि चूंकि यह वर्ग टेक्स्ट फ़ाइलों से संबंधित है, इसलिए आपको टेक्स्ट फ़ाइल के चरित्र-सेट और कुछ अन्य गुणों को निर्दिष्ट करने की आवश्यकता नहीं है। ज्यादातर मामलों के लिए यह मूल रूप से आउट ऑफ़ द बॉक्स समाधान प्रदान करता है। यह अंतर्राष्ट्रीयकरण और स्थानीयकरण का भी समर्थन करता है।
लेकिन फिर भी यह अभी भी धीमा है (एक बार 2 बाइट पढ़ने और इसके माध्यम से लूपिंग इमेजिंग!)।
बफरिंग धाराओं
एक बाइट या 2. जावा लोग एक उल्लेखनीय कार्यात्मकता जोड़ पर निरंतर पाशन की समस्या हल करने के लिए। "प्रक्रिया से पहले, एक बफर बनाने के लिए।"
अवधारणा एक उपयोगकर्ता यूट्यूब पर एक वीडियो स्ट्रीम की तरह काफी है। एक वीडियो बफ़र से पहले ही खेलता है, इसलिए व्यक्ति को निर्दोष वीडियो को देखने के अनुभव हो जाता है। (और यह बफरिंग रहता है जब तक पूरे वीडियो के आगे बफ़र है समय, जब आप देखते हैं।)
उसी तकनीक का BufferedReader वर्ग द्वारा प्रयोग किया जाता है, BufferedReader वस्तु FileReader वस्तु जो पाठ फ़ाइल को पढ़ने की जरूरत है के बारे में सभी जानकारी शामिल है।
लेता है
बफर रीडर ऑब्जेक्ट फ़ाइलreader ऑब्जेक्ट को दिए गए टेक्स्ट फ़ाइल को पढ़ने के लिए उपयोग करता है। प्रत्येक बार फ़ाइल रीडर टेक्स्ट फ़ाइल से 2 बाइट पढ़ता है, यह डेटा बफर रीडर ऑब्जेक्ट पर देता है। अब, बफर रीडर ऑब्जेक्ट भी "बफर" नामक एक विशेष मेमोरी जगह बनाता है, और वहां सभी बफर किए गए डेटा स्टोर करता है।
BufferedReader br = new BufferedReader(new FileReader("example.txt"));
2 बाइट्स एक समय पढ़ने की प्रक्रिया, FileReader वस्तु हिट जब तक दोहरा रहता है, '\ n', '\ r n \' (एक नई लाइन चरित्र), और BufferReader बंद हो जाता है बफरिंग । अगली पंक्ति को पढ़ने के लिए निर्देश (जब तक अगली पंक्ति बफर करने के लिए) दिया जाता है।
// this variable points to the buffered line
String line;
// Keep buffering the lines and print it.
while ((line = br.readLine()) != null) {
printWriter.println(line);
}
अब यहाँ, बजाय 2 बाइट्स पढ़ने के लिए, तो कुछ जादू है और फिर इसे भंडारण वापस, एक पूरी लाइन लाई गई है और कहीं न कहीं रैम में संग्रहित, और जब आप जादू के साथ किया जाता है, तो आप स्टोर कर सकते हैं पूरी लाइन वापस। तो यह एक बार 2 बाइट्स करने की तुलना में प्रक्रिया को तेजी से चलाता है।
लेकिन फिर, हमें फ़ाइलरडर ऑब्जेक्ट को बफररडर को पास करने की आवश्यकता क्यों है? क्या हम सिर्फ "इस फ़ाइल को बफर नहीं कर सकते" और यह करता है, क्या वह मीठा और छोटा नहीं होगा?
तरह से यह काम करता है यह, BufferReader वर्ग एक गूंगा वर्ग कितना बफ़र होना जानता है, जो है, ऐसा करने से बफ़र या यह सिर्फ परवाह नहीं करता कि क्या बारे में एक सुराग नहीं है। तो कहा जा रहा है कि, जब आप FileReader प्रदान करते हैं यह एक फ़ाइल, उसी तरह बफ़र्स अगर आप जैसे InputStreamReader की एक वस्तु प्रदान करते हैं
// Object that reads console inputs
InputStreamReader console = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(console);
System.out.println(br.readLine());
जब तक यह हिट यह टर्मिनल/कंसोल इनपुट डेटा को स्कैन करेगा एक नया लाइन प्रतीक, और स्कैन की गई पंक्ति को बफर में संग्रहीत करता है।
तो अब आप जानते हैं कि एक पढ़ सकते हैं (बफर) इस तरह के पाठ फ़ाइलें, शान्ति, प्रिंटर, नेटवर्किंग डेटा आदि, और सभी वह/वह है याद करने के लिए है के रूप में BufferReader वर्ग के साथ कई धाराओं,,
bufferedReader.readLine();
जो भी आप बफरिंग कर रहे हैं उसे मुद्रित करने के लिए।
ग्रेट स्पष्टीकरण! – JavaDeveloper
धन्यवाद! मैं बस कुछ जटिल अवधारणाओं को समझाने की कोशिश कर रहा था! :) –
वास्तव में अच्छा स्पष्टीकरण, यह मेरे संदेहों को पूरी तरह से मंजूरी दे दी। :) –