Java Language
ByteBuffer
खोज…
परिचय
बाइनरी डेटा पर काम करने में आसानी के लिए ByteBuffer
वर्ग को जावा 1.4 में पेश किया गया था। यह विशेष रूप से आदिम प्रकार के डेटा के साथ उपयोग करने के लिए अनुकूल है। यह निर्माण की अनुमति देता है, लेकिन बाद में एक byte[]
उच्च हेरफेर स्तर पर हेरफेर करता है
वाक्य - विन्यास
- बाइट [] गिरफ्तारी = नई बाइट [1000];
- बाइटबफ़र बफर = बाइटबफ़र.प्रैप (गिरफ्तार);
- बाइटबफ़र बफर = बाइटबफ़र.आलोकेट (1024);
- बाइटबफ़र बफर = बाइटबफ़र.ऑलोकेटडायरेक्ट (1024);
- बाइट बी = बफर.गेट ();
- बाइट बी = बफर.गेट (10);
- शॉर्ट एस = बफर.गॉटशॉर्ट (10);
- बफर.पुट (बाइट) 120);
- buffer.putChar ( 'एक');
मूल उपयोग - एक बाइटबफ़र बनाना
ByteBuffer
बनाने के दो तरीके हैं, जहां एक को फिर से उप-विभाजित किया जा सकता है।
यदि आपके पास पहले से मौजूद byte[]
, तो आप प्रसंस्करण को आसान बनाने के लिए इसे ByteBuffer
में "लपेट" सकते हैं:
byte[] reqBuffer = new byte[BUFFER_SIZE];
int readBytes = socketInputStream.read(reqBuffer);
final ByteBuffer reqBufferWrapper = ByteBuffer.wrap(reqBuffer);
यह कोड के लिए एक संभावना होगी जो निम्न-स्तरीय नेटवर्किंग इंटरैक्शन को संभालती है
यदि आपके पास पहले से मौजूद byte[]
, तो आप उस byte[]
पर एक ByteBuffer
बना सकते हैं जो विशेष रूप से इस के लिए बफर के लिए आवंटित किया गया है:
final ByteBuffer respBuffer = ByteBuffer.allocate(RESPONSE_BUFFER_SIZE);
putResponseData(respBuffer);
socketOutputStream.write(respBuffer.array());
यदि कोड-पाथ अत्यंत परफॉर्मेंस क्रिटिकल है और आपको डायरेक्ट सिस्टम मेमोरी एक्सेस की आवश्यकता है , तो ByteBuffer
#allocateDirect()
का उपयोग करके डायरेक्ट बफ़र्स भी आवंटित कर सकता है।
मूल उपयोग - बफ़र को डेटा लिखें
एक ByteBuffer
उदाहरण को देखते हुए, रिश्तेदार और निरपेक्ष put
का उपयोग करके इसे आदिम-टाइप डेटा लिख सकते हैं। हड़ताली अंतर यह है कि सापेक्ष विधि का उपयोग करके डेटा डालने से आपके लिए उस डेटा को सम्मिलित किए जाने वाले सूचकांक का ट्रैक रहता है, जबकि निरपेक्ष विधि में हमेशा डेटा को put
के लिए एक सूचकांक देने की आवश्यकता होती है।
दोनों विधियां " कॉलिंग " कॉल की अनुमति देती हैं। एक पर्याप्त आकार के बफ़र को देखते हुए एक व्यक्ति निम्न कार्य कर सकता है:
buffer.putInt(0xCAFEBABE).putChar('c').putFloat(0.25).putLong(0xDEADBEEFCAFEBABE);
जो इसके बराबर है:
buffer.putInt(0xCAFEBABE);
buffer.putChar('c');
buffer.putFloat(0.25);
buffer.putLong(0xDEADBEEFCAFEBABE);
ध्यान दें कि byte
s पर काम करने वाला तरीका विशेष रूप से नामित नहीं है। इसके अतिरिक्त ध्यान दें कि इसे put
लिए एक ByteBuffer
और एक byte[]
दोनों को पास करना भी मान्य है। इसके अलावा, सभी आदिम प्रकारों में विशेष put
मैथोड होते हैं।
एक अतिरिक्त नोट: पूर्ण put*
का उपयोग करते समय दिया गया सूचकांक हमेशा byte
s में गिना जाता है।
मूल उपयोग - DirectByteBuffer का उपयोग करना
DirectByteBuffer
की विशेष कार्यान्वयन है ByteBuffer
नहीं है कि byte[]
बिछाने के नीचे।
हम कॉल करके ऐसे बाइटफायर आवंटित कर सकते हैं:
ByteBuffer directBuffer = ByteBuffer.allocateDirect(16);
यह ऑपरेशन 16 बाइट्स मेमोरी आवंटित करेगा। प्रत्यक्ष बफ़र्स की सामग्री सामान्य कचरा एकत्र ढेर के बाहर निवास कर सकती है ।
हम यह सत्यापित कर सकते हैं कि क्या ByteBuffer कॉल करके प्रत्यक्ष है:
directBuffer.isDirect(); // true
DirectByteBuffer
की मुख्य विशेषताएं यह है कि JVM मूल रूप से आवंटित मेमोरी पर बिना किसी अतिरिक्त बफरिंग के काम करने की कोशिश करेगा, ताकि इस पर किए जाने वाले ऑपरेशन तेज़ हो सकें, फिर जो बाइटबफ़र पर प्रदर्शन किए गए हैं, जो नीचे झूठ बोल रहे हैं।
यह DirectByteBuffer
का उपयोग करने के लिए भारी IO संचालन के साथ किया गया है जो वास्तविक समय संचार की तरह निष्पादन की गति पर निर्भर करता है।
हमें इस बात से अवगत होना चाहिए कि यदि हम array()
पद्धति का उपयोग करने का प्रयास करते हैं तो हमें UnsupportedOperationException
मिल जाएगी। तो यह एक अच्छा अभ्यास है कि क्या हमारे बाइटबफ़र के पास यह है (बाइट सरणी) इससे पहले कि हम इसे एक्सेस करने की कोशिश करें:
byte[] arrayOfBytes;
if(buffer.hasArray()) {
arrayOfBytes = buffer.array();
}
डायरेक्ट बाइट बफर का एक अन्य उपयोग जेएनआई के माध्यम से इंटरोप है। चूंकि एक प्रत्यक्ष बाइट बफर एक byte[]
उपयोग नहीं करता है, लेकिन मेमोरी का एक वास्तविक ब्लॉक, मूल कोड में एक पॉइंटर के माध्यम से उस मेमोरी को सीधे एक्सेस करना संभव है। यह जावा और डेटा के मूल प्रतिनिधित्व के बीच मार्शलिंग पर थोड़ी परेशानी और उपरि को बचा सकता है।
जेएनआई इंटरफ़ेस प्रत्यक्ष बाइट बफ़र्स को संभालने के लिए कई कार्यों को परिभाषित करता है: एनआईओ समर्थन ।