2010-11-01 13 views
9

क्या कोई सूक्ष्म कारण है java.nio.ByteBufferjava.io.DataOutput या java.io.DataInput लागू नहीं करता है, या क्या लेखकों ने ऐसा करने का विकल्प नहीं चुना है? यह कॉल को मैप करने के लिए सीधा प्रतीत होता है (उदा। PutInt() -> writeInt())।बाइटबफर डेटा आउटपुट/डेटा इनपुट लागू कर सकता है?

मूल समस्या I (और कुछ others, स्पष्ट रूप से) पुराने वर्ग हैं जो सामान्य इंटरफेस का उपयोग करके स्वयं को क्रमबद्ध/क्रमबद्ध करने के बारे में जानते हैं: डेटा इनपुट/डेटाऑटपुट। मैं बाइटबफर के लिए कस्टम प्रॉक्सी लिखने के बिना अपने कस्टम क्रमिकरण का पुन: उपयोग करना चाहता हूं।

उत्तर

4

बस put() या wrap() तरीकों का उपयोग कर ByteArrayInputStream या ByteArrayOutputStream में बफर लपेट दें। ByteBuffer रखने में समस्या सीधे डेटा आकार/आउटपुट स्ट्रीम को अनुकरण करती है, आकार को पहले से नहीं जानना है। अगर ओवररन हो तो क्या होगा?

ByteBufferOutputStream की आवश्यकता है जिसमें आप आवश्यक व्यवहार लपेट/खोल सकते हैं। इसके उदाहरण मौजूद हैं; Apache avro क्रमबद्धता योजना ऐसी चीज है। अपना खुद का रोल करना मुश्किल नहीं है। डिफ़ॉल्ट रूप से कोई क्यों नहीं है? खैर, यह एक आदर्श दुनिया नहीं है ...

ByteArrayOutputStream backing = new ByteArrayOutputStream(); 
DataOutput foo = new DataOutputStream(backing); 
// do your serialization out to foo 

foo.close(); 
ByteBuffer buffer = ByteBuffer.wrap(backing.toByteArray()); 
// now you've got a bytebuffer... 
+0

+ एवरो का उल्लेख करने के लिए, यह दिलचस्प लग रहा है। – Justin

+0

पढ़ने पर ओवररन EOFException फेंक देना चाहिए; लिखने पर ओवररन का इलाज पूरी तरह से पूर्ण मात्रा में लिखने जैसा होगा (या केवल ईओएफ को भी फेंक दें) – Justin

+0

@ जस्टिन: 'डेटाऑटपुट' एपीआई को देखकर, हाँ, यह ठीक काम कर सकता है। हो सकता है कि यह सुनिश्चित करने के लिए थोड़ा प्रयोग करें कि आप 'बाइटबफर' पर 'डेटाऑटपुट' को स्पष्ट रूप से प्रॉक्सी कर सकते हैं और ओरेकल साइट पर बग पोस्ट कर सकते हैं या एनआईओ विशेषज्ञ समूह से संपर्क कर सकते हैं। ऐसा हो सकता है कि इन दो एपिस का उद्देश्य अमूर्तता के विभिन्न स्तरों को लक्षित करना है; मुझे यकीन नहीं है। – andersoj

4

एक बेहतर तरीका है कि प्रत्यक्ष बफ़र्स भी साथ काम करता है:

class ByteBufferOutputStream extends OutputStream 
{ 
    private final ByteBuffer buffer; 

    public ByteBufferOutputStream(ByteBuffer buffer) 
    { 
     this.buffer = buffer; 
    } 

    public void write(int b) throws IOException 
    { 
     buffer.put((byte) b); 
    } 
} 

नोट इस buffer.flip() कॉल करने के बाद आप के लिए लिख किया जाता है की आवश्यकता है कि इससे पहले कि आप इससे पढ़ सकें।

संबंधित मुद्दे