जावा I / O में वास्तव में "स्ट्रीम" और "बफर" का क्या अर्थ है?


85

मैंने बस इनपुट / आउटपुट के उपयोग के बारे में सीखा BufferedReader

मुझे पता है कि वास्तव में इस शब्द का अर्थ क्या हैं चाहता था Streamऔर Buffer?

कोड की यह पंक्ति हमें क्या प्रदान करती है:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

जवाबों:


202

जावा में इनपुट और आउटपुट (I / O) के लिए दो प्रकार की कक्षाएं हैं: धाराएँ और पाठक / लेखक

स्ट्रीम ( InputStream, OutputStreamऔर सब कुछ है कि इन फैली) पढ़ने और फ़ाइलों, नेटवर्क, या कोई अन्य डिवाइस से बाइनरी डेटा लिखने के लिए कर रहे हैं।

पाठक और लेखक पाठ (अक्षर) पढ़ने और लिखने के लिए हैं। वे धाराओं के शीर्ष पर एक परत है, जो एक वर्ण एन्कोडिंग का उपयोग करके, द्विआधारी डेटा (बाइट्स) को वर्णों और पीठ में परिवर्तित करता है ।

डिस्क बाइट-बाय-बाय डेटा पढ़ना बहुत ही अक्षम है। इसे गति देने का एक तरीका बफर का उपयोग करना है: एक बार में एक बाइट पढ़ने के बजाय, आप एक बार में कुछ हज़ार बाइट्स पढ़ते हैं, और उन्हें एक बफर में, स्मृति में डालते हैं। फिर आप एक-एक करके बफर में बाइट्स को देख सकते हैं।

I / O के बारे में ओरेकल का जावा ट्यूटोरियल इसे विस्तार से बताता है।

आपके द्वारा प्रदत्त कोड की लाइन को देखते हुए:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.inएक है InputStream। आप एक InputStreamReaderबाइट बनाते हैं जिसमें से बाइट्स पढ़ते हैं System.in। फिर आप इसे एक में लपेटें BufferedReader

तो, अंत में, आपके पास BufferedReaderवह है जो InputStreamReaderउस से पढ़ता है, जिसमें से पढ़ता है System.in


1
आपके उत्तर के लिए धन्यवाद, लेकिन मुझे एक भ्रम है। जैसा कि आपने कहा कि हमने एक बार में कुछ हजारों बाइट्स पढ़े और उन्हें बफर में डाल दिया; तो क्या इसका मतलब यह है कि बफर स्मृति में सिर्फ एक जगह है जहां हम चीजों को स्टोर कर रहे हैं?
user122345656

3
@ जेस्पर। आपने कहा "इसे गति देने का एक तरीका एक बफर का उपयोग करना है: एक बार में एक बाइट पढ़ने के बजाय, आप एक बार में कुछ हज़ार बाइट्स पढ़ते हैं, और उन्हें एक बफर में, मेमोरी में डालते हैं। फिर आप बाइट्स को देख सकते हैं। एक-एक करके बफर में। " हाँ, यह सच है, लेकिन मुझे लगता है कि बफर के साथ भी, सिंगल बाइट को एक समय में पढ़ा जाता है। केवल अंतर मुझे लगता है कि इसे बफर और प्रोग्राम में रखा गया है, फिर इसे डिस्क के बजाय बफर से पढ़ें
M Sach

7
@ user122345656 हां, एक बफर डेटा को अस्थायी रूप से स्टोर करने के लिए मेमोरी में एक जगह है।
जेसपर

14
@ जब आप हार्डडिस्क से डेटा पढ़ना चाहते हैं तो क्या होता है, इसके बारे में सोचें। एक निश्चित स्थान पर एक बाइट को पढ़ने के लिए, आपको तब तक इंतजार करना होगा जब तक डिस्क घूम नहीं जाती है जब तक कि डिस्क डिस्क पर उस स्थान से ऊपर नहीं होती है जहां बाइट को पढ़ा जाना है। यदि आप उस समय सिर्फ 1 बाइट पढ़ते हैं, और अगली बाइट बाद में, आपको तब तक इंतजार करना होगा जब तक डिस्क ने अगले बाइट को पढ़ने के लिए एक पूर्ण रोटेशन न बना दिया हो। लगातार बाइट्स का एक ब्लॉक पढ़ने के लिए यह अधिक कुशल है।
जेसपर

2
@parsecer स्ट्रीम बाइट्स पढ़ने के लिए हैं; पाठक पाठ (अक्षर) पढ़ने के लिए हैं। InputStreamReaderएक रैपर InputStreamहै जो आपको एक से पाठ पढ़ने की अनुमति देता है InputStream। यदि आप केवल बाइट्स (वर्ण नहीं) पढ़ना चाहते हैं, तो आपको आवश्यकता नहीं है InputStreamReader। यदि आप पाठ वर्णों के रूप में बाइट्स की व्याख्या करना चाहते हैं तो यह उपयोगी है।
जेस्पर

20

बफर:

यह एक भौतिक मेमोरी स्टोरेज का एक क्षेत्र है जिसका उपयोग अस्थायी रूप से डेटा को स्टोर करने के लिए किया जाता है जबकि इसे एक स्थान से दूसरे स्थान पर ले जाया जा रहा है। यही कारण है कि भौतिक स्मृति भंडारण होगा रैम (रैंडम एक्सेस मेमोरी) ज्यादातर मामलों में।

लेकिन इस प्रश्न के संदर्भ से, डेटा पढ़ने / लिखने के दौरान बफर का उपयोग किया जाता है। एक स्थान से दूसरे स्थान पर डेटा ले जाते समय इसका उपयोग नहीं किया जाना चाहिए।

बफ़र के लिए उदाहरण: यदि आपके सिस्टम में 4 GB RAM है, तो सिस्टम द्वारा बफ़र के लिए 4 KB मेमोरी (RAM) आवंटित की जा सकती है। KB - किलोबाइट (s), GB - गीगाबाइट (s)

I / O स्ट्रीम (या) स्ट्रीम:

I / O स्ट्रीम एक इनपुट स्रोत या आउटपुट गंतव्य का प्रतिनिधित्व करता है। एक स्ट्रीम डिस्क फ़ाइलों, उपकरणों, अन्य कार्यक्रमों और मेमोरी सरणियों सहित कई विभिन्न प्रकार के स्रोतों और गंतव्यों का प्रतिनिधित्व कर सकती है।

I / O का अर्थ है इनपुट / आउटपुट।

तो, इनपुट स्ट्रीम एक इनपुट स्रोत हो सकता है जैसे डिस्क फ़ाइल, नेटवर्क कनेक्शन आदि।

और, आउटपुट स्ट्रीम डिस्क फ़ाइल, नेटवर्क कनेक्शन आदि जैसे आउटपुट गंतव्य हो सकते हैं।

जावा आधिकारिक दस्तावेज के अनुसार , धाराएँ 3 प्रकार की होती हैं।

  1. बाइट स्ट्रीम (बाइट्स पढ़ें या लिखें)
  2. चरित्र धाराएँ ( वर्ण पढ़ें या लिखें)
  3. बफर स्ट्रीम ( दक्षता के लिए बफ़र से पढ़ें या लिखें )

बाइट स्ट्रीम:

वे 8-बिट बाइट्स का इनपुट और आउटपुट करते हैं। सभी बाइट स्ट्रीम कक्षाएं इनपुटस्ट्रीम और आउटपुटस्ट्रीम से नीचे उतारी जाती हैं

बाइट इनपुट स्ट्रीम कक्षाएं कच्चे बाइट्स के रूप में इनपुट प्राप्त करती हैं । बाइट आउटपुट स्ट्रीम कक्षाएं कच्चे बाइट्स के रूप में आउटपुट देती हैं ।

InputStream- प्रत्यक्ष ज्ञात उपवर्ग

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream- प्रत्यक्ष ज्ञात उपवर्ग

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

चरित्र धाराएँ: वे बाइट धाराओं के ऊपर एक परत हैं। वे वर्णों और वर्णों को बाइट्स में बाइट्स (बाइनरी डेटा) में परिवर्तित करते हैं, वर्ण एन्कोडिंग का उपयोग करके।

सभी चरित्र स्ट्रीम क्लासेस को रीडर और राइटर से उतारा जाता है

Reader - प्रत्यक्ष ज्ञात उपवर्ग

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer - प्रत्यक्ष ज्ञात उपवर्ग

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

बाइट स्ट्रीम्स और कैरेक्टर स्ट्रीम्स अनबफर्ड I / O का उपयोग करते हैं ।

इसका अर्थ है कि प्रत्येक पढ़ा या लिखा गया अनुरोध अंतर्निहित ओएस द्वारा सीधे नियंत्रित किया जाता है। यह एक प्रोग्राम को बहुत कम कुशल बना सकता है, क्योंकि इस तरह के प्रत्येक अनुरोध अक्सर डिस्क एक्सेस, नेटवर्क गतिविधि, या कुछ अन्य ऑपरेशन को ट्रिगर करता है जो अपेक्षाकृत महंगा है। इस तरह के ओवरहेड को कम करने के लिए, जावा प्लेटफॉर्म के कार्यान्वयन ने I / O स्ट्रीम को बफ़र किया।

बफर स्ट्रीम:

बफर इनपुट धाराएँ बफर के रूप में ज्ञात मेमोरी क्षेत्र से डेटा पढ़ती हैं ; मूल इनपुट API केवल तभी कहा जाता है जब बफर खाली हो।

इसी तरह, बफर आउटपुट स्ट्रीम डेटा को एक बफर में लिखते हैं , और देशी आउटपुट एपीआई को केवल तभी कहा जाता है जब बफर भरा हुआ हो।

एक प्रोग्राम एक अपरिवर्तित स्ट्रीम को रैपिंग मुहावर का उपयोग करके एक बफ़र स्ट्रीम में परिवर्तित कर सकता है , जहां एक अनफ़र स्ट्रीम स्ट्रीम ऑब्जेक्ट को बफ़र्ड स्ट्रीम क्लास के लिए कंस्ट्रक्टर को पास किया जाता है ।

उदाहरण:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

4 बफ़रड स्ट्रीम क्लास हैं जिनका उपयोग अनफ़रवर्ड स्ट्रीम को लपेटने के लिए किया जाता है:

बफर बाइट स्ट्रीम बनाने के लिए, BufferedInputStreamऔर BufferedOutputStreamकक्षाएं।

बफ़र किए गए चरित्र स्ट्रीम बनाने के लिए, BufferedReaderऔर BufferedWriterकक्षाएं।


1
मैं जावा io के लिए इस तरह के एक गहन स्पष्टीकरण के लिए देख रहा था। आपका बहुत बहुत धन्यवाद।
आरिफ रेजा

14

अच्छी तरह से अपने दिमाग में एक सवाल जो java.io पैकेज पर काम करना शुरू करते हैं। आपके प्रश्न की शर्तों का जवाब देने के लिए InputStreamReader और BufferedReader केवल जावा ऑब्जेक्ट्स का प्रतिनिधित्व करते हैं (उनके बारे में कुछ भी विशेष नहीं है), लेकिन वे io ऑपरेशन्स के लिए बनाए जाते हैं जैसे पढ़ना और लिखना / से लेकर विभिन्न इनपुट / आउटपुट जैसे फ़ाइल, ऑब्जेक्ट आदि।

अब लाइन पर आते हैं

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

InputStreamReader बाइट्स के इनपुट स्ट्रीम को पढ़ने के लिए क्लास है। लेकिन प्रत्येक बाइट को पढ़ने के लिए महंगा ऑपरेशन है, इसलिए हम इसे बफ़रड्रेडर के चारों ओर लपेट रहे हैं ताकि इसे बफ़र किया जा सके (जो डेकोरेटर पैटर्न है)

तो क्या होगा आप पढ़ना शुरू करने से पहले भी, बफ़रड्रेडर बाइट्स के कुछ हिस्से को रजिस्टर में स्टोर करेगा और जब आप रीड ऑपरेशन करेंगे। यह उस स्थान से पढ़ा जाएगा जो कंसोल / फ़ाइल से पढ़ने की तुलना में बहुत कम खर्चीला है लेकिन इनपुटस्ट्रीमरएडर के मामले में, जब आप रीड ऑपरेशन करते हैं तो हर बार डिस्क एक्सेस ऑपरेशन होता है


+1 लेकिन मैं पसंद करूंगा कि अगर जानकारी डेकोरेटर के लिए लिंक संदर्भ जोड़ा होता और हर बार डिस्क एक्सेस ऑपरेशन के लिए
भावनाएं होतीं

यह अंतिम पैराग्राफ लाभ को अच्छी तरह से बताता है। उसके लिये आपका धन्यवाद।
डेव वॉयल्स

3

एक धारा कनेक्शन और वास्तविक जानकारी बिंदुओं के बीच पारित किया जा रहा है। बफ़र एक स्टोरेज कंटेनर है जो सभी या स्ट्रीम किए गए डेटा को स्टोर करता है और इसे आउटपुट डिवाइस को फीड करता है।

बेशक, बिंदु यह है कि यदि डेटा को दिखाने के लिए आवश्यक डेटा दर से परे धारा धीमी हो जाती है, तो आउटपुट रुक जाएगा। बफर इसे रोकता है।


Ans.But के लिए धन्यवाद एक सवाल जो मेरे दिमाग में आया था कि स्ट्रीम डेटा का क्या मतलब है?
user122345656

1
देर से उत्तर के लिए क्षमा करें। यदि आप सर्वर पर 10Mb फ़ाइल के सरल उदाहरण की कल्पना करते हैं। सर्वर में पूरी फ़ाइल है, लेकिन यह पूरी फ़ाइल को एक पैकेट में नहीं भेज सकता है। इसके बजाय, फ़ाइल ब्लॉक की एक सीमित संख्या में विभाजित है। प्रत्येक ब्लॉक को फिर दूरस्थ कंप्यूटर पर भेजा जाता है, और फिर से भेजा जाता है। लाइव डेटा स्ट्रीमिंग के लिए, एक ही सिद्धांत लागू होता है। लेकिन सर्वर लाइव डेटा लेता है और इसे streamपैकेट के रूप में भेजता है । रिमोट कंप्यूटर एक बफर में प्रत्येक पैकेट को संग्रहीत करता है। दूरस्थ कंप्यूटर डेटा को बफ़र से पढ़ता है और इससे एक वीडियो कहता है। आशा है कि ये आपकी मदद करेगा!
पीजीअलाघेर

1

एक बफर मेमोरी में एक हिस्सा है जो परिधीय उपकरणों से डेटा की एक धारा को संग्रहीत करने के लिए उपयोग किया जाता है। फिर इस बफ़र से डेटा की इस धारा को इकट्ठा किया जाता है और इसे चर में संग्रहीत किया जाता है। एक धारा को डेटा के निरंतर प्रवाह के रूप में परिभाषित किया जा सकता है।

बहुत शब्द "इनपुट / आउटपुट" का मतलब बफ़र्स में और बाहर जाने वाले डेटा से ज्यादा कुछ नहीं है। बस इसे हर समय अपने दिमाग में रखें। प्रक्रियाएँ ऑपरेटिंग सिस्टम के अनुरोध के द्वारा I / O का प्रदर्शन करती हैं जो कि डेटा को बफर (राइट ऑपरेशन) से हटा दिया जाता है या यह कि एक बफर डेटा (रीड ऑपरेशन) से भर जाता है।
डेटा कैसे चलता है इसका तार्किक चित्र

सरल शब्दों में, जब आप किसी कीबोर्ड में डेटा टाइप करते हैं, तो डेटा पाइप ( स्ट्रीम) से होकर गुजरता है ) से बफर तक जाता है और फिर बफर से डिस्क तक (ऑपरेशन लिखने) होता है। इसी तरह जब डेटा डिस्क से बफर और बफर से आपके कंसोल पर जाता है तो यह ऑपरेशन पढ़ा जाता है।

आप बेहतर समझ के लिए लिंक पढ़ सकते हैं। आशा है कि इससे सहायता मिलेगी!।
जावा में बफर क्या है
यहां लिंक विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.