2011-01-30 21 views
134

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

+0

अपाचे हैडोप का संपीड़न (उदाहरण के लिए zlib कोडेक) jave.nio से बाइटबफर का उपयोग करता है। – nikk

उत्तर

98

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

+2

क्या जावा और कैसंद्रा डीबी का उपयोग करके विकसित उच्च ट्रैफिक वेबसाइट में कहीं भी उपयोगी है? – Aklin

+1

त्वरित खोज के बाद, ऐसा लगता है कि हाँ, कैसंद्रा बाइटबफर का उपयोग करता है: http://www.mail-archive.com/[email protected]/msg14967.html यदि आप कच्ची वेबसाइट के बारे में सोच रहे हैं, तो वहां हो सकता है, लेकिन आम तौर पर यह केवल अप्रत्यक्ष रूप से वेबसाइटों द्वारा उपयोग किया जा रहा है - कैसंड्रा – kelloti

+1

जैसे टूल का उपयोग करके एक बुरा लिंक नहीं, धन्यवाद। इसे जोड़ना चाहूंगा जो मुझे उपयोगी लगे - https://worldmodscode.wordpress.com/2012/12/14/the-java-bytebuffer-a-crash-course/ –

78

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

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

  • सापेक्ष bulk get विधियां जो इस बफर से बाइट के संगत दृश्यों को एक सरणी में स्थानांतरित करती हैं;

  • सापेक्ष bulk put तरीकों कि एक बाइट सरणी या इस बफर में कुछ अन्य बाइट बफर से बाइट्स से सटे दृश्यों हस्तांतरण;

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

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

  • compacting, duplicating, और slicing एक बाइट बफर के लिए तरीके।

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 
+45

इस टिप्पणी का बड़ा हिस्सा [जावा से कॉपी किया गया है 7 डॉक्स] (http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html)। –

+6

जब तक आप एक गैर-स्पष्ट दुष्प्रभाव का लाभ नहीं उठा रहे हैं, मुझे विश्वास है कि आप पूर्ण रूप से गलत तरीके से गलत तरीके का उपयोग कर रहे हैं। जावाडोक इंगित करता है कि पूर्ण पॉट को इंडेक्स वैल्यू की आवश्यकता होती है। –

+5

भले ही यह एपीआई डॉक्टर की एक प्रति है, यहां तक ​​कि इसके स्कोर बीसीएस भी खराब हैं, कुछ लोग इसे देखने के लिए बहुत आलसी लगते हैं। – Chris

13

एंड्रॉयड में आप जावा सी के बीच साझा बफर ++ और (directAlloc विधि के साथ) बना सकते हैं और दोनों पक्षों में यह हेरफेर कर सकते हैं।

12

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

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

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

Java Documentation of Byte Buffer has useful information.

6

Here एक महान ByteBuffer लाभ समझा लेख है।अनुसरण कर रहे हैं लेख में प्रमुख बिंदु: एक ByteBuffer के

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

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

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

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

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

  1. पृष्ठ साझाकरण: स्मृति मैप की गई फ़ाइलों प्रक्रियाओं के बीच साझा किया जा सकता के रूप में वे इस प्रक्रिया के आभासी स्मृति अंतरिक्ष में आवंटित किए जाते हैं और प्रक्रियाओं में साझा किया जा सकता है।
संबंधित मुद्दे