Java में ByteBuffer का उपयोग क्या है? [बन्द है]


199

ByteBufferजावा में उदाहरण के लिए आवेदन क्या हैं ? कृपया किसी भी उदाहरण परिदृश्य को सूचीबद्ध करें जहाँ इसका उपयोग किया जाता है। धन्यवाद!


1
Apache Hadoop का कम्प्रेशन (उदाहरण के लिए zlib codec) jave.nio से बाइटबफ़र का उपयोग करता है।
निकक

GPU के लिए डेटा भेजने के लिए अच्छा है।
पिक्सेल

जवाबों:


138

यह इसके उपयोग और कमियों का एक अच्छा विवरण है। जब भी आपको तेज निम्न-स्तर I / O करने की आवश्यकता होती है, आप अनिवार्य रूप से इसका उपयोग करते हैं। यदि आप एक टीसीपी / आईपी प्रोटोकॉल को लागू करने जा रहे हैं या यदि आप एक डेटाबेस (DBMS) लिख रहे हैं तो यह वर्ग काम आएगा।


3
यह जावा और कैसंड्रा डीबी का उपयोग करके विकसित एक उच्च यातायात वेबसाइट में कहीं भी उपयोगी है?
अकलिन

1
एक त्वरित खोज के बाद, ऐसा प्रतीत होता है कि हाँ, कैसेंड्रा बाइटबफ़र का उपयोग करता है: mail-archive.com/commits@cassandra.apache.org/msg14967.html यदि आप एक कच्ची वेबसाइट के बारे में सोच रहे हैं, तो हो सकता है, लेकिन आमतौर पर केवल अप्रत्यक्ष रूप से वेबसाइटों द्वारा इस्तेमाल किया जा रहा है - कैसंड्रा जैसे उपकरणों का उपयोग करके
kelloti

1
एक बुरा लिंक नहीं, धन्यवाद। इसे जोड़ना चाहेंगे जो मुझे उपयोगी लगा - worldmodscode.wordpress.com/2012/12/14/…
पीटर पेराह

बुरा लिंक मैं डर रहा हूँ ...
RoyalBigMack

96

बाइटबफ़र वर्ग महत्वपूर्ण है क्योंकि यह जावा में चैनलों के उपयोग के लिए एक आधार बनाता है। ByteBuffer वर्ग, बाइट बफ़र्स पर आपरेशन के छह श्रेणियों को परिभाषित करता है के रूप में जावा 7 दस्तावेज में कहा गया है :

  • निरपेक्ष और सापेक्ष प्राप्त और डाल तरीकों कि पढ़ सकते हैं और एक बाइट लिखना;

  • सापेक्ष बल्क को ऐसे तरीके मिलते हैं जो इस बफर से बाइट्स के सन्निहित अनुक्रमों को एक सरणी में स्थानांतरित करते हैं;

  • सापेक्ष बल्क पुट मेथड्स जो एक बाइट सरणी या किसी अन्य बाइट बफर से बाइट्स के सन्निहित अनुक्रमों को इस बफर में स्थानांतरित करते हैं;

  • निरपेक्ष और सापेक्ष प्राप्त करते हैं और एक विशेष बाइट क्रम में बाइट्स के अनुक्रमों से उन्हें अनुवाद करने और अन्य आदिम प्रकारों के मूल्यों को पढ़ने और लिखने वाले तरीके डालते हैं;

  • व्यू बफ़र्स बनाने की विधियाँ, जो एक बाइट बफर को किसी अन्य आदिम प्रकार के मूल्यों वाले बफर के रूप में देखने की अनुमति देती हैं; तथा

  • एक बाइट बफर को कॉम्पैक्ट करने , डुप्लिकेट करने और स्लाइस करने के तरीके ।

Example code : Putting Bytes into a buffer.

    // Create an empty ByteBuffer with a 10 byte capacity
    ByteBuffer bbuf = ByteBuffer.allocate(10);

    // Get the buffer's capacity
    int capacity = bbuf.capacity(); // 10

    // Use the absolute put(int, byte).
    // This method does not affect the position.
    bbuf.put(0, (byte)0xFF); // position=0

    // Set the position
    bbuf.position(5);

    // Use the relative put(byte)
    bbuf.put((byte)0xFF);

    // Get the new position
    int pos = bbuf.position(); // 6

    // Get remaining byte count
    int rem = bbuf.remaining(); // 4

    // Set the limit
    bbuf.limit(7); // remaining=1

    // This convenience method sets the position to 0
    bbuf.rewind(); // remaining=7

56
इस टिप्पणी का थोक जावा 7 डॉक्स से कॉपी किया गया है ।
जानूस ट्रॉल्सन

6
जब तक आप एक गैर-स्पष्ट साइड इफेक्ट का लाभ नहीं ले रहे हैं, मेरा मानना ​​है कि आप निरपेक्ष पुट के लिए गलत तरीके का उपयोग कर रहे होंगे। Javadoc इंगित करता है कि निरपेक्ष पुट के लिए एक सूचकांक मूल्य की आवश्यकता होती है।
चक वोल्बर

6
यहां तक ​​कि अगर यह सिर्फ एपी की एक प्रति है, तो इसके स्कोर को भी खराब कर देता है क्योंकि कुछ लोग इस पर एक नज़र डालते हैं।
क्रिस

1
एक उदाहरण में एक गलती है। "पूर्ण पुट", पहले पैरामीटर को याद करता है जो सूचकांक का प्रतिनिधित्व करता है (इस मामले में 0)।
bvdb

21

जावा ओरिएंट स्ट्रीम ओरिएंटेड एपीआई का उपयोग करके यूजर स्पेस के भीतर डेटा के अस्थायी भंडारण के रूप में बफर का उपयोग करके किया जाता है। डीएमए द्वारा डिस्क से पढ़ा गया डेटा पहले कर्नेल स्पेस में बफ़र्स पर कॉपी किया जाता है, जिसे बाद में यूजर स्पेस में बफर में ट्रांसफर कर दिया जाता है। इसलिए उपरि है। इससे बचने से प्रदर्शन में काफी लाभ मिल सकता है।

हम इस अस्थायी बफ़र को उपयोगकर्ता स्थान में छोड़ सकते हैं, अगर कर्नेल स्थान में बफ़र तक सीधे पहुंचने का कोई तरीका है। Java NIO ऐसा करने का एक तरीका प्रदान करता है।

ByteBufferजावा NIO द्वारा प्रदान किए गए कई बफ़र्स में से एक है। इसके सिर्फ एक कंटेनर या होल्डिंग टैंक से डेटा पढ़ने या डेटा लिखने के लिए। उपरोक्त व्यवहार बफ़र allocateDirect()पर एपीआई का उपयोग करके एक सीधा बफर आवंटित करके प्राप्त किया जाता है ।

बाइट बफर के जावा प्रलेखन में उपयोगी जानकारी है।


14

Android में आप C ++ और Java (DirectAlloc पद्धति के साथ) के बीच साझा बफर बना सकते हैं और इसे दोनों पक्षों में जोड़ तोड़ कर सकते हैं।


13

यहाँ एक शानदार लेख है जो बाइटबफ़र के लाभों को समझाता है। लेख में मुख्य बिंदु निम्नलिखित हैं:

  • चाहे वह प्रत्यक्ष या अप्रत्यक्ष हो, एक बाइटबफ़र का पहला लाभ संरचित बाइनरी डेटा की कुशल यादृच्छिक अभिगम (जैसे, निम्न-स्तरीय IO जैसा कि किसी एक उत्तर में बताया गया है) है। जावा 1.4 से पहले, ऐसे डेटा को पढ़ने के लिए कोई डेटाइन्स्ट्रीमस्ट्रीम का उपयोग कर सकता है, लेकिन बिना यादृच्छिक पहुंच के।

प्रत्यक्ष बाइटबफ़र / मैप्डबाइटबफ़र के लिए विशेष रूप से निम्नलिखित लाभ हैं। ध्यान दें कि ढेर के बाहर प्रत्यक्ष बफ़र्स बनाए जाते हैं:

  1. जीसी चक्रों से अप्रभावित : कूड़े के संग्रह के दौरान प्रत्यक्ष बफ़र्स को स्थानांतरित नहीं किया जाएगा क्योंकि वे ढेर के बाहर रहते हैं। Terracota के BigMemory कैशिंग प्रौद्योगिकी यह लाभ पर काफी भरोसा करने लगता है। यदि वे ढेर पर होते हैं, तो यह जीसी ठहराव समय को धीमा कर देगा।

  2. प्रदर्शन को बढ़ावा देने के लिए : धारा IO में, रीड कॉल कॉल्स सिस्टम कॉल होती है, जिसके लिए उपयोगकर्ता के बीच कर्नेल मोड और इसके विपरीत एक संदर्भ-स्विच की आवश्यकता होती है, जो विशेष रूप से महंगा होगा यदि फ़ाइल लगातार एक्सेस की जा रही है। हालाँकि, मेमोरी-मैपिंग के साथ यह संदर्भ-स्विचिंग कम हो जाती है क्योंकि डेटा मेमोरी (MappedByteBuffle) में पाए जाने की अधिक संभावना है। यदि डेटा मेमोरी में उपलब्ध है, तो यह ओएस, यानी बिना संदर्भ-स्विचिंग के सीधे पहुंच जाता है।

ध्यान दें कि MpedByteBuffers बहुत उपयोगी हैं, खासकर यदि फाइलें बड़ी हैं और ब्लॉक के कुछ समूह अधिक बार एक्सेस किए जाते हैं।

  1. पृष्ठ साझाकरण : मेमोरी मैप की गई फ़ाइलों को प्रक्रियाओं के बीच साझा किया जा सकता है क्योंकि उन्हें प्रक्रिया की वर्चुअल मेमोरी स्पेस में आवंटित किया जाता है और प्रक्रियाओं के दौरान साझा किया जा सकता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.