2009-02-20 10 views
5

बाइट्स को बाइटबफर bbuf_src से बाइटबफर bbuf_dest (साथ ही साथ पता है कि कितने बाइट स्थानांतरित किए गए थे) में बाइट्स को स्थानांतरित करने का सबसे प्रभावी तरीका क्या है? मैं bbuf_dest.put(bbuf_src) की कोशिश कर रहा हूं लेकिन ऐसा लगता है कि यह एक बफर ओवरफ्लो एक्सेप्शन फेंकना चाहता है और जब मुझे उनकी ज़रूरत है तो मुझे अभी सूर्य से जावाडॉक्स नहीं मिल सकते हैं (नेटवर्क समस्याएं)। > :(अरेएक बाइटबफर से दूसरे


संपादित करें:। Darnit, @ रिचर्ड दृष्टिकोण (उपयोग पुट() bbuf_src के समर्थन सरणी से) यदि bbuf_src एक ReadOnly बफर है काम नहीं करेगा, जैसा कि आप के लिए उपयोग नहीं कर सकते कि सरणी। मैं उस मामले ???

+0

मुझे लगता है कि आपको इसे दो प्रश्नों में तोड़ना चाहिए। – GEOCHET

+0

अन्य आधे को यहां स्थानांतरित कर दिया गया है: http://stackoverflow.com/questions/570218/downloading-sun-javadocs-mirror-websites –

उत्तर

1

ठीक है, मैं अनुकूल नहीं बनाया है @ रिचर्ड जवाब:

public static int transferAsMuchAsPossible(
        ByteBuffer bbuf_dest, ByteBuffer bbuf_src) 
{ 
    int nTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining()); 
    if (nTransfer > 0) 
    { 
    bbuf_dest.put(bbuf_src.array(), 
        bbuf_src.arrayOffset()+bbuf_src.position(), 
        nTransfer); 
    bbuf_src.position(bbuf_src.position()+nTransfer); 
    } 
    return nTransfer; 
} 

और एक परीक्षण बनाने के लिए यकीन है कि यह काम करता है:

public static boolean transferTest() 
{ 
    ByteBuffer bb1 = ByteBuffer.allocate(256); 
    ByteBuffer bb2 = ByteBuffer.allocate(50); 
    for (int i = 0; i < 100; ++i) 
    { 
     bb1.put((byte)i); 
    } 
    bb1.flip(); 
    bb1.position(5); 
    ByteBuffer bb1a = bb1.slice(); 
    bb1a.position(2); 
    // bb3 includes the 5-100 range 
    bb2.put((byte)77); 
    // something to see this works when bb2 isn't empty 
    int n = transferAsMuchAsPossible(bb2, bb1a); 
    boolean itWorked = (n == 49); 

    if (bb1a.position() != 51) 
     itWorked = false; 
    if (bb2.position() != 50) 
     itWorked = false; 
    bb2.rewind(); 
    if (bb2.get() != 77) 
     itWorked = false; 
    for (int i = 0; i < 49; ++i) 
    { 
     if (bb2.get() != i+7) 
     { 
      itWorked = false; 
      break; 
     } 
    } 
    return itWorked; 
} 
1

में क्या कर सकते हैं क्योंकि आपके bbuf_dest काफी बड़ा नहीं है आप BufferOverflowException मिलता है।

आप bbuf_dest.remaining() का उपयोग करने की अधिकतम संख्या पता लगाने के लिए की आवश्यकता होगी बाइट्स आप bbuf_src से स्थानांतरित कर सकते हैं:

int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining()); 
bbuf_dest.put(bbuf_src.array(), 0, maxTransfer); 
+0

आह। यह सहायक है। मुझे लगता है कि मुझे पता है कि अब क्या करना है। धन्यवाद। लेकिन ध्यान दें कि आपका उत्तर काम नहीं करेगा अगर bbuf_src किसी अन्य बफर के लिए व्यू बफर है। मुझे लगता है कि मैं इसे अनुकूलित कर सकता हूं। –

+0

(या यदि bbuf_src की स्थिति है> 0) –

+0

... और मुझे bbuf_src की स्थिति को भी अपडेट करना होगा। –

8

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

int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining()); 
// use a duplicated buffer so we don't disrupt the limit of the original buffer 
ByteBuffer bbuf_tmp = bbuf_src.duplicate(); 
bbuf_tmp.limit (bbuf_tmp.position() + maxTransfer); 
bbuf_dest.put (bbuf_tmp); 

// now discard the data we've copied from the original source (optional) 
bbuf_src.position(bbuf_src.position() + maxTransfer); 
+0

लेकिन ओरेकल का कहना है कि सीमा "बफर की क्षमता से बड़ी नहीं होनी चाहिए"। एक बफर डुप्लिकेट करने से इसकी क्षमता डुप्लिकेट हो जाएगी, है ना? –