2010-06-06 12 views
11

मुझे यहां काफी समस्या है, और मुझे लगता है कि ऐसा इसलिए है क्योंकि मुझे समझ में नहीं आता कि मुझे जावा द्वारा प्रदान की गई API का उपयोग कैसे करना चाहिए।ByteArrayOutputStream और DataOutputStream का उपयोग कैसे करें (जावा)

मैं एक int और एक byte[]

में एक byte[] मैं एक DataOutputStream का उपयोग कर हल करने के लिए डेटा writeInt(int i) और write(byte[] b) के साथ लेखन, और डाल करने के लिए है कि एक बाइट सरणी में सक्षम होने के लिए के बारे में सोचा लिखने की ज़रूरत मैं चाहिए का उपयोग ByteArrayOutputStream विधि toByteArray().

मैं समझता हूँ कि यह कक्षाएं आवरण पैटर्न का उपयोग, तो मैं दो विकल्प था:

DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream()); 

या

ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream()); 

लेकिन दोनों ही मामलों में, मैं "ढीला" एक विधि। पहले मामले में, मैं toByteArray() विधि तक नहीं पहुंच सकता, और दूसरे में, मैं writeInt() विधि तक नहीं पहुंच सकता।

मुझे इन कक्षाओं को एक साथ कैसे उपयोग करना चाहिए?

उत्तर

35
इस तरह

:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream w = new DataOutputStream(baos); 

w.writeInt(100); 
w.write(byteArray); 

w.flush(); 

byte[] result = baos.toByteArray(); 

वास्तव में अपने दूसरे संस्करण बिल्कुल काम नहीं होगा। DataOutputStream को एक वास्तविक लक्ष्य स्ट्रीम की आवश्यकता है जिसमें डेटा लिखना है। आप new DataOutputStream() नहीं कर सकते हैं। वास्तव में ऐसा कोई कन्स्ट्रक्टर नहीं है।

+0

की तरह अधिक मैं हमेशा आश्चर्य किया है, वहाँ वास्तव में मैं फ्लश करने के लिए एक लिपटे 'ByteArrayOutputStream' कारण क्या है? – Justin

+0

ऐसा नहीं है लेकिन आप कभी भी एक रैपर के व्यवहार को नहीं जानते हैं। यह वास्तव में कुछ बफर कर सकता था इसलिए मैं आदत से रैपर को फ्लश करता हूं :)। यदि यह पास-थ्रू रैपर है तो उसे चोट नहीं पहुँचना चाहिए। –

+0

क्या आप बाइटएरे वैरिएबल घोषित कर सकते हैं? और वास्तव में क्या w.write (byteArray); कर? –

1

ByteArrayOutputStream के आसपास DataOutputStream लपेटें। बस सुनिश्चित करें कि आप ByteArrayOutputStream के संदर्भ को सहेज लें। जब आप करीब() या कम से कम फ्लश() DataOutputStream समाप्त कर लेंगे और फिर ByteArrayOutputStream की ToyteArray विधि का उपयोग करें।

0

इंटीजर क्लास में int के बाइट मान प्राप्त करने का एक तरीका है। Integer.byteValue()

1

आप अगर आप एक PipedInputStream/PipetOutputStream के माध्यम से एक InputStream करने के लिए अपने outputstream कनेक्ट एक धारा दृष्टिकोण का उपयोग कर सकते हैं। फिर आप इनपुटस्ट्रीम से डेटा का उपभोग करेंगे।

वैसे भी है कि आप क्या करने की जरूरत है सरल है और मैं एक java.nio.ByteBuffer का प्रयोग करेंगे आपके पास है जिस पर एक धारा दृष्टिकोण की आवश्यकता नहीं नहीं करता है तो

  • अपने byte[]
  • putInt(int value)
  • और byte[] array() के लिए put(byte[] src) सामग्री प्राप्त करने के लिए
2

क्या आप ByteArrayOutpu पर रखने के लिए एक चर बना सकते हैं tStream और इसे DataOutputStream में पास करें।

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 
dos.writeInt(1); 
byte[] result = dos.toByteArray(); 
1

आप नहीं है की जरूरत है इस

Example exampleExample = method(example); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos); 
Message message = MessageBuilder.withBody(baos.toByteArray()).build(); 
+0

स्टैक ओवरफ्लो में आपका स्वागत है! कृपया मार्कडाउन के साथ ** स्वरूपण ** 'कोड' पर विचार करें ताकि इसे पढ़ना आसान हो। अधिक जानकारी: http://stackoverflow.com/editing-help – Aloso

+0

धन्यवाद और क्षमा करें – mantamusica