बाइटबफ़र की फ्लिप विधि का उद्देश्य क्या है? (और इसे "फ्लिप" क्यों कहा जाता है?)


95

बाइटबफ़र के फ्लिप () विधि को "फ्लिप" क्यों कहा जाता है? यहाँ "फ़्लिप" क्या है? एपिडोक के अनुसार, दो क्रमिक फ़्लिप मूल स्थिति को पुनर्स्थापित नहीं करेंगे, और कई फ़्लिप शायद limit()शून्य हो जाएंगे।

क्या मैं किसी भी तरह बाइट्स का पुन: उपयोग करने के लिए "अनफिलिप" कर सकता हूं?

क्या मैं किसी अन्य डेटा के साथ फ़्लिप किया जा सकता है?


5
यह पढ़ने के लिए लिखने के लिए (और इसके विपरीत) बफर "flips"। thushw.blogspot.com/2009/10/…
ब्रायन रोच

2
@BrianRoach: यह पढ़ने से लिखने के लिए फ़्लिप करता है लेकिन लिखने के लिए उतना उपयोगी नहीं है जब तक कि आप निश्चित आकार की संरचना नहीं लिख रहे हैं। पढ़ने के लिए लिखने के लिए फ़्लिप करने के लिए, resetइसके बजाय उपयोग करें ।
nnonneo

"उद्देश्य" प्रश्न पूछना याद रखें; या, कम से कम, प्रमुख प्रश्न को उद्देश्यपूर्ण

@nneonneo - यह थोड़े गैर-सवाल था, विवरणों को समझाने के लिए वास्तव में ज्यादा समय नहीं देना था, इसलिए सिर्फ एक टिप्पणी और एक लिंक।
ब्रायन रोच

जवाबों:


130

के लिए एक काफी सामान्य उपयोग मामला ByteBufferहै कुछ डेटा संरचना का निर्माण-दर-टुकड़ा और फिर उस संपूर्ण संरचना को डिस्क पर लिखना। "I / O से पढ़ना" ( ting) से "I / O के लिए लेखन " ( ting) flipको फ्लिप करने के लिए उपयोग किया जाता है : s के अनुक्रम को भरने के लिए उपयोग किए जाने के बाद , बफर की सीमा को वर्तमान स्थिति पर सेट करेगा और स्थिति को शून्य पर रीसेट करें। यह भविष्य बनाने या बफर से जो कुछ भी बफर में था और नहीं और अधिक लिखने का प्रभाव है ।ByteBufferputgetputByteBufferflipgetwriteput

समाप्त करने के बाद put, आप ByteBufferअन्य डेटा संरचना का निर्माण करने के लिए पुन: उपयोग करना चाह सकते हैं । इसे "अनफ़िलिप" करने के लिए, कॉल करें clear। यह क्षमता की सीमा को मापता है (सभी बफर को प्रयोग करने योग्य बनाता है), और 0 की स्थिति।

इसलिए, एक विशिष्ट उपयोग परिदृश्य:

ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
    b.clear();
    b.put(header[i]);
    b.put(data[i]);
    b.flip();
    out.write(b);
}

एक प्रकार का क्या है out?
सुजान सिओक

6
या कुछ और जो एक write(ByteBuffer)विधि है। (यह वास्तव में प्रासंगिक नहीं है कि इसका प्रकार क्या है ...)
स्टीफन C

1
यह Buffer.clearक्षमता और स्थिति की सीमा को रीसेट करना चाहिए । Buffer.resetकेवल स्थिति को रीसेट करना चाहिए mark
केल्विन एनजी

1
@ केल्विनग: आप सही कह रहे हैं; मैंने इसे प्रतिबिंबित करने के लिए उत्तर में संशोधन किया है। अच्छी पकड़ के लिए धन्यवाद!
nnonneo

1
@ user963241: I / O से बफर में पढ़ें , बफर से I / O में लिखें ।
nnonneo

7

फ्लिप वर्तमान संपत्ति के लिए वर्तमान स्थिति मान प्रदान करता है और स्थिति संपत्ति को 0. पर सेट करता है। Flip केवल एक बफर से सक्रिय तत्वों को निकालने के लिए उपयोगी है।

उदाहरण के लिए, नीचे प्रोग्राम "हैलो" प्रिंट करता है बफर के खाली तत्व नहीं। विधि कॉल की सीमा और स्थिति को फ्लिप के साथ बदला जा सकता है।

CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello"); 
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);      
while(cbuff.hasRemaining()) {
    System.out.println(cbuff.get());
}

बफ़र्स और चैनलों पर अधिक जानकारी के लिए http://www.zoftino.com/java-nio-tutorial देखें ।


बहुत व्यापक कवरेज के लिंक के लिए धन्यवाद! जब स्रोत शामिल होते हैं तो यह बहुत अच्छा होता है। जावा एपीआई डॉक्स बिना स्पष्टीकरण के 'फ्लिप' शब्द का उपयोग करने के लिए लग रहा था, जैसे कि यह एक सामान्य कंप्यूटर विज्ञान शब्द था, लेकिन जाहिर है कि कुछ लोगों (मेरे सहित) ने ऐसा नहीं पाया।
जॉन मेयर

3

बाइटबफ़र बीमार डिजाइन किया गया है। सभ्य प्रोग्रामर की बहुत सारी शिकायतें हैं।

तो इसके बारे में तर्क करने की कोशिश न करें, बस अध्ययन करें और एपीआई का सावधानी से उपयोग करें।

अब मैं एक विकल्प प्रस्तुत किए बिना इसे खराब नहीं कर सकता, इसलिए यहां यह है:

एक बफर में एक निश्चित है capacity; यह 2 बिंदुओं को बनाए रखता है: startऔर end। स्थिति और वेतन वृद्धि get()पर बाइट देता है । स्थिति और वेतन वृद्धि पर बाइट डालता है । नहीं !startstartput()endendflip()


6
तो, शिकायतें क्या हैं? यदि आपके पास कुछ व्यक्तिगत शिकायत है जो ठीक भी है, लेकिन यह सिर्फ "एक्स एपीआई बेकार है, लोगों ने ऐसा कहा" करने के लिए नहीं करता है।
nnonneo

13
उस लिंक को पोस्ट करना शाब्दिक रूप से आप सभी को पहली जगह में करना था। मैंने कभी आप पर झूठ बोलने का आरोप नहीं लगाया, मैंने केवल आपसे स्रोत और शिकायतों की प्रकृति के बारे में विस्तार से पूछा।
nnonneo

2
यह सिर्फ एक जगह है जहाँ लोग अपनी मदद स्वेच्छा से देते हैं, जिसमें वे उचित मात्रा में प्रयास करते हैं। मुझे प्रत्येक उत्तर को एक अच्छी तरह से शोध किए गए अकादमिक पेपर में विस्तारित करने की आवश्यकता नहीं है।
अपरिवर्तनीय

8
और यह भी एक जगह है जहां लोग किसी के शब्द को तब तक नहीं लेंगे जब तक कि यह विश्वसनीय न लगे।
अरुणमोझी

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

0

फ्लिप () विधि एक बफर को चैनल-राइट या रिश्तेदार के संचालन के नए अनुक्रम के लिए तैयार करती है: यह वर्तमान स्थिति की सीमा निर्धारित करता है और फिर स्थिति को शून्य पर सेट करता है।

बफ़र इसमें लिखे गए आंकड़ों पर नज़र रखता है। पोस्ट लेखन, फ्लिप () विधि को लेखन से रीडिंग मोड में स्विच करने के लिए कहा जाता है।

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